src/share/vm/interpreter/rewriter.hpp

Sat, 21 May 2011 15:39:54 -0700

author
coleenp
date
Sat, 21 May 2011 15:39:54 -0700
changeset 2945
d3b9f2be46ab
parent 2314
f95d63e2154a
child 3969
1d7922586cf6
permissions
-rw-r--r--

7033141: assert(has_cp_cache(i)) failed: oob
Summary: Unrewrite bytecodes for OOM error allocating the constant pool cache.
Reviewed-by: dcubed, acorn, never

     1 /*
     2  * Copyright (c) 1998, 2010, 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 #ifndef SHARE_VM_INTERPRETER_REWRITER_HPP
    26 #define SHARE_VM_INTERPRETER_REWRITER_HPP
    28 #include "memory/allocation.hpp"
    29 #include "runtime/handles.inline.hpp"
    30 #include "utilities/growableArray.hpp"
    32 // The Rewriter adds caches to the constant pool and rewrites bytecode indices
    33 // pointing into the constant pool for better interpreter performance.
    35 class Rewriter: public StackObj {
    36  private:
    37   instanceKlassHandle _klass;
    38   constantPoolHandle  _pool;
    39   objArrayHandle      _methods;
    40   intArray            _cp_map;
    41   intStack            _cp_cache_map;
    42   bool                _have_invoke_dynamic;
    44   void init_cp_map(int length) {
    45     _cp_map.initialize(length, -1);
    46     // Choose an initial value large enough that we don't get frequent
    47     // calls to grow().
    48     _cp_cache_map.initialize(length / 2);
    49   }
    50   int  cp_entry_to_cp_cache(int i) { assert(has_cp_cache(i), "oob"); return _cp_map[i]; }
    51   bool has_cp_cache(int i) { return (uint)i < (uint)_cp_map.length() && _cp_map[i] >= 0; }
    52   int maybe_add_cp_cache_entry(int i) { return has_cp_cache(i) ? _cp_map[i] : add_cp_cache_entry(i); }
    53   int add_cp_cache_entry(int cp_index) {
    54     assert((cp_index & _secondary_entry_tag) == 0, "bad tag");
    55     assert(_cp_map[cp_index] == -1, "not twice on same cp_index");
    56     int cache_index = _cp_cache_map.append(cp_index);
    57     _cp_map.at_put(cp_index, cache_index);
    58     assert(cp_entry_to_cp_cache(cp_index) == cache_index, "");
    59     return cache_index;
    60   }
    61   int add_secondary_cp_cache_entry(int main_cpc_entry) {
    62     assert(main_cpc_entry < _cp_cache_map.length(), "must be earlier CP cache entry");
    63     int cache_index = _cp_cache_map.append(main_cpc_entry | _secondary_entry_tag);
    64     return cache_index;
    65   }
    67   // Access the contents of _cp_cache_map to determine CP cache layout.
    68   int cp_cache_entry_pool_index(int cache_index) {
    69     int cp_index = _cp_cache_map[cache_index];
    70     if ((cp_index & _secondary_entry_tag) != 0)
    71       return -1;
    72     else
    73       return cp_index;
    74   }
    75   int cp_cache_secondary_entry_main_index(int cache_index) {
    76     int cp_index = _cp_cache_map[cache_index];
    77     if ((cp_index & _secondary_entry_tag) == 0)
    78       return -1;
    79     else
    80       return (cp_index - _secondary_entry_tag);
    81   }
    83   // All the work goes in here:
    84   Rewriter(instanceKlassHandle klass, constantPoolHandle cpool, objArrayHandle methods, TRAPS);
    86   void compute_index_maps();
    87   void make_constant_pool_cache(TRAPS);
    88   void scan_method(methodOop m, bool reverse = false);
    89   void rewrite_Object_init(methodHandle m, TRAPS);
    90   void rewrite_member_reference(address bcp, int offset, bool reverse = false);
    91   void rewrite_invokedynamic(address bcp, int offset, bool reverse = false);
    92   void maybe_rewrite_ldc(address bcp, int offset, bool is_wide, bool reverse = false);
    93   // Revert bytecodes in case of an exception.
    94   void restore_bytecodes();
    96   static methodHandle rewrite_jsrs(methodHandle m, TRAPS);
    97  public:
    98   // Driver routine:
    99   static void rewrite(instanceKlassHandle klass, TRAPS);
   100   static void rewrite(instanceKlassHandle klass, constantPoolHandle cpool, objArrayHandle methods, TRAPS);
   102   enum {
   103     _secondary_entry_tag = nth_bit(30)
   104   };
   106   // Second pass, not gated by is_rewritten flag
   107   static void relocate_and_link(instanceKlassHandle klass, TRAPS);
   108   // JSR292 version to call with it's own methods.
   109   static void relocate_and_link(instanceKlassHandle klass,
   110                                 objArrayHandle methods, TRAPS);
   112 };
   114 #endif // SHARE_VM_INTERPRETER_REWRITER_HPP

mercurial