src/share/vm/oops/methodDataKlass.cpp

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

author
jrose
date
Sat, 30 Oct 2010 11:45:35 -0700
changeset 2265
d1896d1dda3e
parent 2061
9d7a8ab3736b
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

duke@435 1 /*
trims@1907 2 * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
duke@435 22 *
duke@435 23 */
duke@435 24
duke@435 25 # include "incls/_precompiled.incl"
duke@435 26 # include "incls/_methodDataKlass.cpp.incl"
duke@435 27
duke@435 28 klassOop methodDataKlass::create_klass(TRAPS) {
duke@435 29 methodDataKlass o;
duke@435 30 KlassHandle h_this_klass(THREAD, Universe::klassKlassObj());
duke@435 31 KlassHandle k = base_create_klass(h_this_klass, header_size(),
duke@435 32 o.vtbl_value(), CHECK_NULL);
duke@435 33 // Make sure size calculation is right
duke@435 34 assert(k()->size() == align_object_size(header_size()),
duke@435 35 "wrong size for object");
duke@435 36 return k();
duke@435 37 }
duke@435 38
duke@435 39
duke@435 40 int methodDataKlass::oop_size(oop obj) const {
duke@435 41 assert(obj->is_methodData(), "must be method data oop");
duke@435 42 return methodDataOop(obj)->object_size();
duke@435 43 }
duke@435 44
duke@435 45
duke@435 46 bool methodDataKlass::oop_is_parsable(oop obj) const {
duke@435 47 assert(obj->is_methodData(), "must be method data oop");
duke@435 48 return methodDataOop(obj)->object_is_parsable();
duke@435 49 }
duke@435 50
duke@435 51
duke@435 52 methodDataOop methodDataKlass::allocate(methodHandle method, TRAPS) {
duke@435 53 int size = methodDataOopDesc::compute_allocation_size_in_words(method);
duke@435 54 KlassHandle h_k(THREAD, as_klassOop());
duke@435 55 methodDataOop mdo =
duke@435 56 (methodDataOop)CollectedHeap::permanent_obj_allocate(h_k, size, CHECK_NULL);
duke@435 57 assert(!mdo->is_parsable(), "not expecting parsability yet.");
duke@435 58 No_Safepoint_Verifier no_safepoint; // init function atomic wrt GC
duke@435 59 mdo->initialize(method);
duke@435 60
duke@435 61 assert(mdo->is_parsable(), "should be parsable here.");
duke@435 62 assert(size == mdo->object_size(), "wrong size for methodDataOop");
duke@435 63 return mdo;
duke@435 64 }
duke@435 65
duke@435 66
duke@435 67 void methodDataKlass::oop_follow_contents(oop obj) {
duke@435 68 assert (obj->is_methodData(), "object must be method data");
duke@435 69 methodDataOop m = methodDataOop(obj);
duke@435 70
duke@435 71 obj->follow_header();
duke@435 72 MarkSweep::mark_and_push(m->adr_method());
duke@435 73 ResourceMark rm;
duke@435 74 for (ProfileData* data = m->first_data();
duke@435 75 m->is_valid(data);
duke@435 76 data = m->next_data(data)) {
duke@435 77 data->follow_contents();
duke@435 78 }
duke@435 79 }
duke@435 80
duke@435 81 #ifndef SERIALGC
duke@435 82 void methodDataKlass::oop_follow_contents(ParCompactionManager* cm,
duke@435 83 oop obj) {
duke@435 84 assert (obj->is_methodData(), "object must be method data");
duke@435 85 methodDataOop m = methodDataOop(obj);
duke@435 86
duke@435 87 obj->follow_header(cm);
duke@435 88 PSParallelCompact::mark_and_push(cm, m->adr_method());
duke@435 89 ResourceMark rm;
duke@435 90 for (ProfileData* data = m->first_data();
duke@435 91 m->is_valid(data);
duke@435 92 data = m->next_data(data)) {
duke@435 93 data->follow_contents(cm);
duke@435 94 }
duke@435 95 }
duke@435 96 #endif // SERIALGC
duke@435 97
coleenp@548 98
duke@435 99 int methodDataKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
duke@435 100 assert (obj->is_methodData(), "object must be method data");
duke@435 101 methodDataOop m = methodDataOop(obj);
duke@435 102 // Get size before changing pointers
duke@435 103 // Don't call size() or oop_size() since that is a virtual call.
duke@435 104 int size = m->object_size();
duke@435 105
duke@435 106 obj->oop_iterate_header(blk);
duke@435 107 blk->do_oop(m->adr_method());
duke@435 108 ResourceMark rm;
duke@435 109 for (ProfileData* data = m->first_data();
duke@435 110 m->is_valid(data);
duke@435 111 data = m->next_data(data)) {
duke@435 112 data->oop_iterate(blk);
duke@435 113 }
duke@435 114 return size;
duke@435 115 }
duke@435 116
duke@435 117 int methodDataKlass::oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr) {
duke@435 118 assert (obj->is_methodData(), "object must be method data");
duke@435 119 methodDataOop m = methodDataOop(obj);
duke@435 120 // Get size before changing pointers
duke@435 121 // Don't call size() or oop_size() since that is a virtual call.
duke@435 122 int size = m->object_size();
duke@435 123
duke@435 124 obj->oop_iterate_header(blk, mr);
duke@435 125 oop* adr = m->adr_method();
duke@435 126 if (mr.contains(adr)) {
duke@435 127 blk->do_oop(m->adr_method());
duke@435 128 }
duke@435 129 ResourceMark rm;
duke@435 130 for (ProfileData* data = m->first_data();
duke@435 131 m->is_valid(data);
duke@435 132 data = m->next_data(data)) {
duke@435 133 data->oop_iterate_m(blk, mr);
duke@435 134 }
duke@435 135 return size;
duke@435 136 }
duke@435 137
duke@435 138 int methodDataKlass::oop_adjust_pointers(oop obj) {
duke@435 139 assert(obj->is_methodData(), "should be method data");
duke@435 140 methodDataOop m = methodDataOop(obj);
duke@435 141 // Get size before changing pointers
duke@435 142 // Don't call size() or oop_size() since that is a virtual call.
duke@435 143 int size = m->object_size();
duke@435 144
duke@435 145 obj->adjust_header();
duke@435 146 MarkSweep::adjust_pointer(m->adr_method());
duke@435 147 ResourceMark rm;
duke@435 148 ProfileData* data;
duke@435 149 for (data = m->first_data(); m->is_valid(data); data = m->next_data(data)) {
duke@435 150 data->adjust_pointers();
duke@435 151 }
duke@435 152 return size;
duke@435 153 }
duke@435 154
duke@435 155
duke@435 156 #ifndef SERIALGC
duke@435 157 void methodDataKlass::oop_push_contents(PSPromotionManager* pm, oop obj) {
duke@435 158 assert (obj->is_methodData(), "object must be method data");
duke@435 159 methodDataOop m = methodDataOop(obj);
duke@435 160 // This should never point into the young gen.
coleenp@548 161 assert(!PSScavenge::should_scavenge(m->adr_method()), "Sanity");
duke@435 162 }
duke@435 163
duke@435 164 int methodDataKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
duke@435 165 assert(obj->is_methodData(), "should be method data");
duke@435 166 methodDataOop m = methodDataOop(obj);
duke@435 167
duke@435 168 PSParallelCompact::adjust_pointer(m->adr_method());
duke@435 169
duke@435 170 ResourceMark rm;
duke@435 171 ProfileData* data;
duke@435 172 for (data = m->first_data(); m->is_valid(data); data = m->next_data(data)) {
duke@435 173 data->update_pointers();
duke@435 174 }
duke@435 175 return m->object_size();
duke@435 176 }
duke@435 177
duke@435 178 int
duke@435 179 methodDataKlass::oop_update_pointers(ParCompactionManager* cm, oop obj,
duke@435 180 HeapWord* beg_addr, HeapWord* end_addr) {
duke@435 181 assert(obj->is_methodData(), "should be method data");
duke@435 182
duke@435 183 oop* p;
duke@435 184 methodDataOop m = methodDataOop(obj);
duke@435 185
duke@435 186 p = m->adr_method();
duke@435 187 PSParallelCompact::adjust_pointer(p, beg_addr, end_addr);
duke@435 188
duke@435 189 ResourceMark rm;
duke@435 190 ProfileData* data;
duke@435 191 for (data = m->first_data(); m->is_valid(data); data = m->next_data(data)) {
duke@435 192 data->update_pointers(beg_addr, end_addr);
duke@435 193 }
duke@435 194 return m->object_size();
duke@435 195 }
duke@435 196 #endif // SERIALGC
duke@435 197
duke@435 198 #ifndef PRODUCT
duke@435 199
duke@435 200 // Printing
duke@435 201 void methodDataKlass::oop_print_on(oop obj, outputStream* st) {
duke@435 202 assert(obj->is_methodData(), "should be method data");
duke@435 203 methodDataOop m = methodDataOop(obj);
duke@435 204 st->print("method data for ");
duke@435 205 m->method()->print_value_on(st);
duke@435 206 st->cr();
duke@435 207 m->print_data_on(st);
duke@435 208 }
duke@435 209
jrose@1590 210 #endif //PRODUCT
jrose@1590 211
duke@435 212 void methodDataKlass::oop_print_value_on(oop obj, outputStream* st) {
duke@435 213 assert(obj->is_methodData(), "should be method data");
duke@435 214 methodDataOop m = methodDataOop(obj);
duke@435 215 st->print("method data for ");
duke@435 216 m->method()->print_value_on(st);
duke@435 217 }
duke@435 218
duke@435 219 const char* methodDataKlass::internal_name() const {
duke@435 220 return "{method data}";
duke@435 221 }
duke@435 222
duke@435 223
duke@435 224 // Verification
duke@435 225 void methodDataKlass::oop_verify_on(oop obj, outputStream* st) {
duke@435 226 Klass::oop_verify_on(obj, st);
duke@435 227 guarantee(obj->is_methodData(), "object must be method data");
duke@435 228 methodDataOop m = methodDataOop(obj);
duke@435 229 guarantee(m->is_perm(), "should be in permspace");
duke@435 230 m->verify_data_on(st);
duke@435 231 }

mercurial