src/share/vm/oops/cpCacheKlass.cpp

Sat, 30 Oct 2010 11:45:35 -0700

author
jrose
date
Sat, 30 Oct 2010 11:45:35 -0700
changeset 2265
d1896d1dda3e
parent 2068
7fcd5f39bd7a
child 2314
f95d63e2154a
permissions
-rw-r--r--

6981788: GC map generator sometimes picks up the wrong kind of instruction operand
Summary: Distinguish pool indexes from cache indexes in recently changed code.
Reviewed-by: never

     1 /*
     2  * Copyright (c) 1998, 2009, 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 "incls/_precompiled.incl"
    26 #include "incls/_cpCacheKlass.cpp.incl"
    29 int constantPoolCacheKlass::oop_size(oop obj) const {
    30   assert(obj->is_constantPoolCache(), "must be constantPool");
    31   return constantPoolCacheOop(obj)->object_size();
    32 }
    35 constantPoolCacheOop constantPoolCacheKlass::allocate(int length,
    36                                                       bool is_conc_safe,
    37                                                       TRAPS) {
    38   // allocate memory
    39   int size = constantPoolCacheOopDesc::object_size(length);
    41   KlassHandle klass (THREAD, as_klassOop());
    43   // This is the original code.  The code from permanent_obj_allocate()
    44   // was in-lined to allow the setting of is_conc_safe before the klass
    45   // is installed.
    46   // constantPoolCacheOop cache = (constantPoolCacheOop)
    47   //   CollectedHeap::permanent_obj_allocate(klass, size, CHECK_NULL);
    49   oop obj = CollectedHeap::permanent_obj_allocate_no_klass_install(klass, size, CHECK_NULL);
    50   constantPoolCacheOop cache = (constantPoolCacheOop) obj;
    51   cache->set_is_conc_safe(is_conc_safe);
    52   // The store to is_conc_safe must be visible before the klass
    53   // is set.  This should be done safely because _is_conc_safe has
    54   // been declared volatile.  If there are any problems, consider adding
    55   // OrderAccess::storestore();
    56   CollectedHeap::post_allocation_install_obj_klass(klass, obj, size);
    57   NOT_PRODUCT(Universe::heap()->check_for_bad_heap_word_value((HeapWord*) obj,
    58                                                               size));
    60   // The length field affects the size of the object.  The allocation
    61   // above allocates the correct size (see calculation of "size") but
    62   // the size() method of the constant pool cache oop will not reflect
    63   // that size until the correct length is set.
    64   cache->set_length(length);
    66   // The store of the length must be visible before is_conc_safe is
    67   // set to a safe state.
    68   // This should be done safely because _is_conc_safe has
    69   // been declared volatile.  If there are any problems, consider adding
    70   // OrderAccess::storestore();
    71   cache->set_is_conc_safe(methodOopDesc::IsSafeConc);
    72   cache->set_constant_pool(NULL);
    73   return cache;
    74 }
    76 klassOop constantPoolCacheKlass::create_klass(TRAPS) {
    77   constantPoolCacheKlass o;
    78   KlassHandle h_this_klass(THREAD, Universe::klassKlassObj());
    79   KlassHandle k = base_create_klass(h_this_klass, header_size(), o.vtbl_value(), CHECK_NULL);
    80   // Make sure size calculation is right
    81   assert(k()->size() == align_object_size(header_size()), "wrong size for object");
    82   java_lang_Class::create_mirror(k, CHECK_NULL); // Allocate mirror
    83   return k();
    84 }
    87 void constantPoolCacheKlass::oop_follow_contents(oop obj) {
    88   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
    89   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
    90   // Performance tweak: We skip iterating over the klass pointer since we
    91   // know that Universe::constantPoolCacheKlassObj never moves.
    92   // gc of constant pool cache instance variables
    93   MarkSweep::mark_and_push((oop*)cache->constant_pool_addr());
    94   // gc of constant pool cache entries
    95   int i = cache->length();
    96   while (i-- > 0) cache->entry_at(i)->follow_contents();
    97 }
    99 #ifndef SERIALGC
   100 void constantPoolCacheKlass::oop_follow_contents(ParCompactionManager* cm,
   101                                                  oop obj) {
   102   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
   103   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
   104   // Performance tweak: We skip iterating over the klass pointer since we
   105   // know that Universe::constantPoolCacheKlassObj never moves.
   106   // gc of constant pool cache instance variables
   107   PSParallelCompact::mark_and_push(cm, (oop*)cache->constant_pool_addr());
   108   // gc of constant pool cache entries
   109   int i = cache->length();
   110   while (i-- > 0) cache->entry_at(i)->follow_contents(cm);
   111 }
   112 #endif // SERIALGC
   115 int constantPoolCacheKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
   116   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
   117   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
   118   // Get size before changing pointers.
   119   // Don't call size() or oop_size() since that is a virtual call.
   120   int size = cache->object_size();
   121   // Performance tweak: We skip iterating over the klass pointer since we
   122   // know that Universe::constantPoolCacheKlassObj never moves.
   123   // iteration over constant pool cache instance variables
   124   blk->do_oop((oop*)cache->constant_pool_addr());
   125   // iteration over constant pool cache entries
   126   for (int i = 0; i < cache->length(); i++) cache->entry_at(i)->oop_iterate(blk);
   127   return size;
   128 }
   131 int constantPoolCacheKlass::oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr) {
   132   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
   133   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
   134   // Get size before changing pointers.
   135   // Don't call size() or oop_size() since that is a virtual call.
   136   int size = cache->object_size();
   137   // Performance tweak: We skip iterating over the klass pointer since we
   138   // know that Universe::constantPoolCacheKlassObj never moves.
   139   // iteration over constant pool cache instance variables
   140   oop* addr = (oop*)cache->constant_pool_addr();
   141   if (mr.contains(addr)) blk->do_oop(addr);
   142   // iteration over constant pool cache entries
   143   for (int i = 0; i < cache->length(); i++) cache->entry_at(i)->oop_iterate_m(blk, mr);
   144   return size;
   145 }
   147 int constantPoolCacheKlass::oop_adjust_pointers(oop obj) {
   148   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
   149   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
   150   // Get size before changing pointers.
   151   // Don't call size() or oop_size() since that is a virtual call.
   152   int size = cache->object_size();
   153   // Performance tweak: We skip iterating over the klass pointer since we
   154   // know that Universe::constantPoolCacheKlassObj never moves.
   155   // Iteration over constant pool cache instance variables
   156   MarkSweep::adjust_pointer((oop*)cache->constant_pool_addr());
   157   // iteration over constant pool cache entries
   158   for (int i = 0; i < cache->length(); i++)
   159     cache->entry_at(i)->adjust_pointers();
   160   return size;
   161 }
   163 bool constantPoolCacheKlass::oop_is_conc_safe(oop obj) const {
   164   assert(obj->is_constantPoolCache(), "should be constant pool");
   165   return constantPoolCacheOop(obj)->is_conc_safe();
   166 }
   168 #ifndef SERIALGC
   169 void constantPoolCacheKlass::oop_push_contents(PSPromotionManager* pm,
   170                                                oop obj) {
   171   assert(obj->is_constantPoolCache(), "should be constant pool");
   172   if (EnableInvokeDynamic) {
   173     constantPoolCacheOop cache = (constantPoolCacheOop)obj;
   174     // during a scavenge, it is safe to inspect my pool, since it is perm
   175     constantPoolOop pool = cache->constant_pool();
   176     assert(pool->is_constantPool(), "should be constant pool");
   177     if (pool->has_invokedynamic()) {
   178       for (int i = 0; i < cache->length(); i++) {
   179         ConstantPoolCacheEntry* e = cache->entry_at(i);
   180         oop* p = (oop*)&e->_f1;
   181         if (e->is_secondary_entry()) {
   182           if (PSScavenge::should_scavenge(p))
   183             pm->claim_or_forward_depth(p);
   184           assert(!(e->is_vfinal() && PSScavenge::should_scavenge((oop*)&e->_f2)),
   185                  "no live oops here");
   186         }
   187       }
   188     }
   189   }
   190 }
   192 int
   193 constantPoolCacheKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
   194   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
   195   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
   197   // Iteration over constant pool cache instance variables
   198   PSParallelCompact::adjust_pointer((oop*)cache->constant_pool_addr());
   200   // iteration over constant pool cache entries
   201   for (int i = 0; i < cache->length(); ++i) {
   202     cache->entry_at(i)->update_pointers();
   203   }
   205   return cache->object_size();
   206 }
   208 int
   209 constantPoolCacheKlass::oop_update_pointers(ParCompactionManager* cm, oop obj,
   210                                             HeapWord* beg_addr,
   211                                             HeapWord* end_addr) {
   212   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
   213   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
   215   // Iteration over constant pool cache instance variables
   216   oop* p;
   217   p = (oop*)cache->constant_pool_addr();
   218   PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
   220   // Iteration over constant pool cache entries
   221   for (int i = 0; i < cache->length(); ++i) {
   222     cache->entry_at(i)->update_pointers(beg_addr, end_addr);
   223   }
   224   return cache->object_size();
   225 }
   226 #endif // SERIALGC
   228 void constantPoolCacheKlass::oop_print_on(oop obj, outputStream* st) {
   229   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
   230   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
   231   // super print
   232   Klass::oop_print_on(obj, st);
   233   // print constant pool cache entries
   234   for (int i = 0; i < cache->length(); i++) cache->entry_at(i)->print(st, i);
   235 }
   237 void constantPoolCacheKlass::oop_print_value_on(oop obj, outputStream* st) {
   238   assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
   239   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
   240   st->print("cache [%d]", cache->length());
   241   cache->print_address_on(st);
   242   st->print(" for ");
   243   cache->constant_pool()->print_value_on(st);
   244 }
   246 void constantPoolCacheKlass::oop_verify_on(oop obj, outputStream* st) {
   247   guarantee(obj->is_constantPoolCache(), "obj must be constant pool cache");
   248   constantPoolCacheOop cache = (constantPoolCacheOop)obj;
   249   // super verify
   250   Klass::oop_verify_on(obj, st);
   251   // print constant pool cache entries
   252   for (int i = 0; i < cache->length(); i++) cache->entry_at(i)->verify(st);
   253 }
   256 const char* constantPoolCacheKlass::internal_name() const {
   257   return "{constant pool cache}";
   258 }

mercurial