Mercurial > hg > truffle
annotate src/share/vm/oops/constantPoolKlass.cpp @ 3762:5c0a3c1858b1
7048782: CMS: assert(last_chunk_index_to_check<= last_chunk_index) failed: parCardTableModRefBS.cpp:359
Summary: The LNC array is sized before the start of a scavenge, while the heap may expand during a scavenge. With CMS, the last block of an arbitrary suffice of the LNC array may expand due to coalition with the expansion delta. We now take care not to attempt access past the end of the LNC array. LNC array code will be cleaned up and suitably encapsulated as part of the forthcoming performance RFE 7043675.
Reviewed-by: brutisso
author | ysr |
---|---|
date | Thu, 02 Jun 2011 10:23:36 -0700 |
parents | 69c94f488271 |
children | 81d815b05abb |
rev | line source |
---|---|
0 | 1 /* |
2227 | 2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. |
0 | 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 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1155
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1155
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1155
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "classfile/javaClasses.hpp" | |
27 #include "gc_implementation/shared/markSweep.inline.hpp" | |
28 #include "gc_interface/collectedHeap.inline.hpp" | |
29 #include "memory/oopFactory.hpp" | |
30 #include "memory/permGen.hpp" | |
31 #include "memory/universe.inline.hpp" | |
32 #include "oops/constantPoolKlass.hpp" | |
33 #include "oops/constantPoolOop.hpp" | |
34 #include "oops/oop.inline.hpp" | |
35 #include "oops/oop.inline2.hpp" | |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
36 #include "oops/symbol.hpp" |
1972 | 37 #include "runtime/handles.inline.hpp" |
38 #ifdef TARGET_OS_FAMILY_linux | |
39 # include "thread_linux.inline.hpp" | |
40 #endif | |
41 #ifdef TARGET_OS_FAMILY_solaris | |
42 # include "thread_solaris.inline.hpp" | |
43 #endif | |
44 #ifdef TARGET_OS_FAMILY_windows | |
45 # include "thread_windows.inline.hpp" | |
46 #endif | |
47 #ifndef SERIALGC | |
48 #include "gc_implementation/parNew/parOopClosures.inline.hpp" | |
49 #include "gc_implementation/parallelScavenge/psPromotionManager.inline.hpp" | |
50 #include "gc_implementation/parallelScavenge/psScavenge.inline.hpp" | |
51 #include "memory/cardTableRS.hpp" | |
52 #include "oops/oop.pcgc.inline.hpp" | |
53 #endif | |
0 | 54 |
518
0af8b0718fc9
6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents:
431
diff
changeset
|
55 constantPoolOop constantPoolKlass::allocate(int length, bool is_conc_safe, TRAPS) { |
0 | 56 int size = constantPoolOopDesc::object_size(length); |
57 KlassHandle klass (THREAD, as_klassOop()); | |
2229
183658a2d0b3
7018302: newly added assert related to size of constantPoolOop causes secondary assertions or crashes
ysr
parents:
2227
diff
changeset
|
58 assert(klass()->is_oop(), "Can't be null, else handlizing of c below won't work"); |
183658a2d0b3
7018302: newly added assert related to size of constantPoolOop causes secondary assertions or crashes
ysr
parents:
2227
diff
changeset
|
59 constantPoolHandle pool; |
183658a2d0b3
7018302: newly added assert related to size of constantPoolOop causes secondary assertions or crashes
ysr
parents:
2227
diff
changeset
|
60 { |
183658a2d0b3
7018302: newly added assert related to size of constantPoolOop causes secondary assertions or crashes
ysr
parents:
2227
diff
changeset
|
61 constantPoolOop c = |
183658a2d0b3
7018302: newly added assert related to size of constantPoolOop causes secondary assertions or crashes
ysr
parents:
2227
diff
changeset
|
62 (constantPoolOop)CollectedHeap::permanent_obj_allocate(klass, size, CHECK_NULL); |
183658a2d0b3
7018302: newly added assert related to size of constantPoolOop causes secondary assertions or crashes
ysr
parents:
2227
diff
changeset
|
63 assert(c->klass_or_null() != NULL, "Handlizing below won't work"); |
183658a2d0b3
7018302: newly added assert related to size of constantPoolOop causes secondary assertions or crashes
ysr
parents:
2227
diff
changeset
|
64 pool = constantPoolHandle(THREAD, c); |
183658a2d0b3
7018302: newly added assert related to size of constantPoolOop causes secondary assertions or crashes
ysr
parents:
2227
diff
changeset
|
65 } |
0 | 66 |
2229
183658a2d0b3
7018302: newly added assert related to size of constantPoolOop causes secondary assertions or crashes
ysr
parents:
2227
diff
changeset
|
67 pool->set_length(length); |
183658a2d0b3
7018302: newly added assert related to size of constantPoolOop causes secondary assertions or crashes
ysr
parents:
2227
diff
changeset
|
68 pool->set_tags(NULL); |
183658a2d0b3
7018302: newly added assert related to size of constantPoolOop causes secondary assertions or crashes
ysr
parents:
2227
diff
changeset
|
69 pool->set_cache(NULL); |
183658a2d0b3
7018302: newly added assert related to size of constantPoolOop causes secondary assertions or crashes
ysr
parents:
2227
diff
changeset
|
70 pool->set_operands(NULL); |
183658a2d0b3
7018302: newly added assert related to size of constantPoolOop causes secondary assertions or crashes
ysr
parents:
2227
diff
changeset
|
71 pool->set_pool_holder(NULL); |
183658a2d0b3
7018302: newly added assert related to size of constantPoolOop causes secondary assertions or crashes
ysr
parents:
2227
diff
changeset
|
72 pool->set_flags(0); |
0 | 73 // only set to non-zero if constant pool is merged by RedefineClasses |
2229
183658a2d0b3
7018302: newly added assert related to size of constantPoolOop causes secondary assertions or crashes
ysr
parents:
2227
diff
changeset
|
74 pool->set_orig_length(0); |
518
0af8b0718fc9
6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents:
431
diff
changeset
|
75 // if constant pool may change during RedefineClasses, it is created |
0af8b0718fc9
6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents:
431
diff
changeset
|
76 // unsafe for GC concurrent processing. |
2229
183658a2d0b3
7018302: newly added assert related to size of constantPoolOop causes secondary assertions or crashes
ysr
parents:
2227
diff
changeset
|
77 pool->set_is_conc_safe(is_conc_safe); |
0 | 78 // all fields are initialized; needed for GC |
79 | |
2226
c5a923563727
6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents:
2177
diff
changeset
|
80 // Note: because we may be in this "conc_unsafe" state when allocating |
c5a923563727
6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents:
2177
diff
changeset
|
81 // t_oop below, which may in turn cause a GC, it is imperative that our |
c5a923563727
6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents:
2177
diff
changeset
|
82 // size be correct, consistent and henceforth stable, at this stage. |
2229
183658a2d0b3
7018302: newly added assert related to size of constantPoolOop causes secondary assertions or crashes
ysr
parents:
2227
diff
changeset
|
83 assert(pool->is_oop() && pool->is_parsable(), "Else size() below is unreliable"); |
183658a2d0b3
7018302: newly added assert related to size of constantPoolOop causes secondary assertions or crashes
ysr
parents:
2227
diff
changeset
|
84 assert(size == pool->size(), "size() is wrong"); |
2226
c5a923563727
6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents:
2177
diff
changeset
|
85 |
0 | 86 // initialize tag array |
87 typeArrayOop t_oop = oopFactory::new_permanent_byteArray(length, CHECK_NULL); | |
88 typeArrayHandle tags (THREAD, t_oop); | |
89 for (int index = 0; index < length; index++) { | |
90 tags()->byte_at_put(index, JVM_CONSTANT_Invalid); | |
91 } | |
92 pool->set_tags(tags()); | |
93 | |
2226
c5a923563727
6912621: iCMS: Error: assert(_markBitMap.isMarked(addr + 1),"Missing Printezis bit?")
ysr
parents:
2177
diff
changeset
|
94 // Check that our size was stable at its old value. |
2229
183658a2d0b3
7018302: newly added assert related to size of constantPoolOop causes secondary assertions or crashes
ysr
parents:
2227
diff
changeset
|
95 assert(size == pool->size(), "size() changed"); |
0 | 96 return pool(); |
97 } | |
98 | |
99 klassOop constantPoolKlass::create_klass(TRAPS) { | |
100 constantPoolKlass o; | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
101 KlassHandle h_this_klass(THREAD, Universe::klassKlassObj()); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
102 KlassHandle k = base_create_klass(h_this_klass, header_size(), o.vtbl_value(), CHECK_NULL); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
103 // Make sure size calculation is right |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
104 assert(k()->size() == align_object_size(header_size()), "wrong size for object"); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
105 java_lang_Class::create_mirror(k, CHECK_NULL); // Allocate mirror |
0 | 106 return k(); |
107 } | |
108 | |
109 int constantPoolKlass::oop_size(oop obj) const { | |
110 assert(obj->is_constantPool(), "must be constantPool"); | |
111 return constantPoolOop(obj)->object_size(); | |
112 } | |
113 | |
114 | |
115 void constantPoolKlass::oop_follow_contents(oop obj) { | |
116 assert (obj->is_constantPool(), "obj must be constant pool"); | |
117 constantPoolOop cp = (constantPoolOop) obj; | |
118 // Performance tweak: We skip iterating over the klass pointer since we | |
119 // know that Universe::constantPoolKlassObj never moves. | |
120 | |
121 // If the tags array is null we are in the middle of allocating this constant pool | |
122 if (cp->tags() != NULL) { | |
123 // gc of constant pool contents | |
124 oop* base = (oop*)cp->base(); | |
125 for (int i = 0; i < cp->length(); i++) { | |
126 if (cp->is_pointer_entry(i)) { | |
127 if (*base != NULL) MarkSweep::mark_and_push(base); | |
128 } | |
129 base++; | |
130 } | |
131 // gc of constant pool instance variables | |
132 MarkSweep::mark_and_push(cp->tags_addr()); | |
133 MarkSweep::mark_and_push(cp->cache_addr()); | |
1913
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1713
diff
changeset
|
134 MarkSweep::mark_and_push(cp->operands_addr()); |
0 | 135 MarkSweep::mark_and_push(cp->pool_holder_addr()); |
136 } | |
137 } | |
138 | |
139 #ifndef SERIALGC | |
140 void constantPoolKlass::oop_follow_contents(ParCompactionManager* cm, | |
141 oop obj) { | |
142 assert (obj->is_constantPool(), "obj must be constant pool"); | |
143 constantPoolOop cp = (constantPoolOop) obj; | |
144 // Performance tweak: We skip iterating over the klass pointer since we | |
145 // know that Universe::constantPoolKlassObj never moves. | |
146 | |
147 // If the tags array is null we are in the middle of allocating this constant | |
148 // pool. | |
149 if (cp->tags() != NULL) { | |
150 // gc of constant pool contents | |
151 oop* base = (oop*)cp->base(); | |
152 for (int i = 0; i < cp->length(); i++) { | |
153 if (cp->is_pointer_entry(i)) { | |
154 if (*base != NULL) PSParallelCompact::mark_and_push(cm, base); | |
155 } | |
156 base++; | |
157 } | |
158 // gc of constant pool instance variables | |
159 PSParallelCompact::mark_and_push(cm, cp->tags_addr()); | |
160 PSParallelCompact::mark_and_push(cm, cp->cache_addr()); | |
1913
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1713
diff
changeset
|
161 PSParallelCompact::mark_and_push(cm, cp->operands_addr()); |
0 | 162 PSParallelCompact::mark_and_push(cm, cp->pool_holder_addr()); |
163 } | |
164 } | |
165 #endif // SERIALGC | |
166 | |
167 | |
168 int constantPoolKlass::oop_adjust_pointers(oop obj) { | |
169 assert (obj->is_constantPool(), "obj must be constant pool"); | |
170 constantPoolOop cp = (constantPoolOop) obj; | |
171 // Get size before changing pointers. | |
172 // Don't call size() or oop_size() since that is a virtual call. | |
173 int size = cp->object_size(); | |
174 // Performance tweak: We skip iterating over the klass pointer since we | |
175 // know that Universe::constantPoolKlassObj never moves. | |
176 | |
177 // If the tags array is null we are in the middle of allocating this constant | |
178 // pool. | |
179 if (cp->tags() != NULL) { | |
180 oop* base = (oop*)cp->base(); | |
181 for (int i = 0; i< cp->length(); i++) { | |
182 if (cp->is_pointer_entry(i)) { | |
183 MarkSweep::adjust_pointer(base); | |
184 } | |
185 base++; | |
186 } | |
187 } | |
188 MarkSweep::adjust_pointer(cp->tags_addr()); | |
189 MarkSweep::adjust_pointer(cp->cache_addr()); | |
1913
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1713
diff
changeset
|
190 MarkSweep::adjust_pointer(cp->operands_addr()); |
0 | 191 MarkSweep::adjust_pointer(cp->pool_holder_addr()); |
192 return size; | |
193 } | |
194 | |
195 | |
196 int constantPoolKlass::oop_oop_iterate(oop obj, OopClosure* blk) { | |
197 assert (obj->is_constantPool(), "obj must be constant pool"); | |
198 // Performance tweak: We skip iterating over the klass pointer since we | |
199 // know that Universe::constantPoolKlassObj never moves. | |
200 constantPoolOop cp = (constantPoolOop) obj; | |
201 // Get size before changing pointers. | |
202 // Don't call size() or oop_size() since that is a virtual call. | |
203 int size = cp->object_size(); | |
204 | |
205 // If the tags array is null we are in the middle of allocating this constant | |
206 // pool. | |
207 if (cp->tags() != NULL) { | |
208 oop* base = (oop*)cp->base(); | |
209 for (int i = 0; i < cp->length(); i++) { | |
210 if (cp->is_pointer_entry(i)) { | |
211 blk->do_oop(base); | |
212 } | |
213 base++; | |
214 } | |
215 } | |
216 blk->do_oop(cp->tags_addr()); | |
217 blk->do_oop(cp->cache_addr()); | |
1913
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1713
diff
changeset
|
218 blk->do_oop(cp->operands_addr()); |
0 | 219 blk->do_oop(cp->pool_holder_addr()); |
220 return size; | |
221 } | |
222 | |
223 | |
224 int constantPoolKlass::oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr) { | |
225 assert (obj->is_constantPool(), "obj must be constant pool"); | |
226 // Performance tweak: We skip iterating over the klass pointer since we | |
227 // know that Universe::constantPoolKlassObj never moves. | |
228 constantPoolOop cp = (constantPoolOop) obj; | |
229 // Get size before changing pointers. | |
230 // Don't call size() or oop_size() since that is a virtual call. | |
231 int size = cp->object_size(); | |
232 | |
233 // If the tags array is null we are in the middle of allocating this constant | |
234 // pool. | |
235 if (cp->tags() != NULL) { | |
236 oop* base = (oop*)cp->base(); | |
237 for (int i = 0; i < cp->length(); i++) { | |
238 if (mr.contains(base)) { | |
239 if (cp->is_pointer_entry(i)) { | |
240 blk->do_oop(base); | |
241 } | |
242 } | |
243 base++; | |
244 } | |
245 } | |
246 oop* addr; | |
247 addr = cp->tags_addr(); | |
2427
a0de1dfd1933
7030435: Some oop_oop_iterate_m() methods iterate outside of specified memory bounds
ysr
parents:
2379
diff
changeset
|
248 if (mr.contains(addr)) blk->do_oop(addr); |
0 | 249 addr = cp->cache_addr(); |
2427
a0de1dfd1933
7030435: Some oop_oop_iterate_m() methods iterate outside of specified memory bounds
ysr
parents:
2379
diff
changeset
|
250 if (mr.contains(addr)) blk->do_oop(addr); |
1913
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1713
diff
changeset
|
251 addr = cp->operands_addr(); |
2427
a0de1dfd1933
7030435: Some oop_oop_iterate_m() methods iterate outside of specified memory bounds
ysr
parents:
2379
diff
changeset
|
252 if (mr.contains(addr)) blk->do_oop(addr); |
0 | 253 addr = cp->pool_holder_addr(); |
2427
a0de1dfd1933
7030435: Some oop_oop_iterate_m() methods iterate outside of specified memory bounds
ysr
parents:
2379
diff
changeset
|
254 if (mr.contains(addr)) blk->do_oop(addr); |
0 | 255 return size; |
256 } | |
257 | |
518
0af8b0718fc9
6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents:
431
diff
changeset
|
258 bool constantPoolKlass::oop_is_conc_safe(oop obj) const { |
0af8b0718fc9
6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents:
431
diff
changeset
|
259 assert(obj->is_constantPool(), "must be constantPool"); |
0af8b0718fc9
6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents:
431
diff
changeset
|
260 return constantPoolOop(obj)->is_conc_safe(); |
0af8b0718fc9
6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents:
431
diff
changeset
|
261 } |
0af8b0718fc9
6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents:
431
diff
changeset
|
262 |
0 | 263 #ifndef SERIALGC |
264 int constantPoolKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) { | |
265 assert (obj->is_constantPool(), "obj must be constant pool"); | |
266 constantPoolOop cp = (constantPoolOop) obj; | |
267 | |
268 // If the tags array is null we are in the middle of allocating this constant | |
269 // pool. | |
270 if (cp->tags() != NULL) { | |
271 oop* base = (oop*)cp->base(); | |
272 for (int i = 0; i < cp->length(); ++i, ++base) { | |
273 if (cp->is_pointer_entry(i)) { | |
274 PSParallelCompact::adjust_pointer(base); | |
275 } | |
276 } | |
277 } | |
278 PSParallelCompact::adjust_pointer(cp->tags_addr()); | |
279 PSParallelCompact::adjust_pointer(cp->cache_addr()); | |
1913
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1713
diff
changeset
|
280 PSParallelCompact::adjust_pointer(cp->operands_addr()); |
0 | 281 PSParallelCompact::adjust_pointer(cp->pool_holder_addr()); |
282 return cp->object_size(); | |
283 } | |
284 | |
285 void constantPoolKlass::oop_push_contents(PSPromotionManager* pm, oop obj) { | |
286 assert(obj->is_constantPool(), "should be constant pool"); | |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
287 constantPoolOop cp = (constantPoolOop) obj; |
3368
69c94f488271
7043040: JSR292: JRuby bench/shootout/binarytrees.ruby-2.ruby SEGV: constantPoolKlass::oop_follow_contents
never
parents:
2468
diff
changeset
|
288 if (cp->tags() != NULL) { |
2379
b099aaf51bf8
6962931: move interned strings out of the perm gen
jcoomes
parents:
2229
diff
changeset
|
289 for (int i = 1; i < cp->length(); ++i) { |
3368
69c94f488271
7043040: JSR292: JRuby bench/shootout/binarytrees.ruby-2.ruby SEGV: constantPoolKlass::oop_follow_contents
never
parents:
2468
diff
changeset
|
290 if (cp->is_pointer_entry(i)) { |
2379
b099aaf51bf8
6962931: move interned strings out of the perm gen
jcoomes
parents:
2229
diff
changeset
|
291 oop* base = cp->obj_at_addr_raw(i); |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
292 if (PSScavenge::should_scavenge(base)) { |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
293 pm->claim_or_forward_depth(base); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
294 } |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
295 } |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
296 } |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
297 } |
0 | 298 } |
299 #endif // SERIALGC | |
300 | |
301 // Printing | |
302 | |
303 void constantPoolKlass::oop_print_on(oop obj, outputStream* st) { | |
304 EXCEPTION_MARK; | |
305 oop anObj; | |
306 assert(obj->is_constantPool(), "must be constantPool"); | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
0
diff
changeset
|
307 Klass::oop_print_on(obj, st); |
0 | 308 constantPoolOop cp = constantPoolOop(obj); |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
309 if (cp->flags() != 0) { |
1573
beb77f0d41b3
6957004: MethodComparator uses the wrong CP index accessor
jrose
parents:
1155
diff
changeset
|
310 st->print(" - flags: 0x%x", cp->flags()); |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
311 if (cp->has_pseudo_string()) st->print(" has_pseudo_string"); |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
579
diff
changeset
|
312 if (cp->has_invokedynamic()) st->print(" has_invokedynamic"); |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
313 st->cr(); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
314 } |
1573
beb77f0d41b3
6957004: MethodComparator uses the wrong CP index accessor
jrose
parents:
1155
diff
changeset
|
315 st->print_cr(" - cache: " INTPTR_FORMAT, cp->cache()); |
0 | 316 |
317 for (int index = 1; index < cp->length(); index++) { // Index 0 is unused | |
318 st->print(" - %3d : ", index); | |
319 cp->tag_at(index).print_on(st); | |
320 st->print(" : "); | |
321 switch (cp->tag_at(index).value()) { | |
322 case JVM_CONSTANT_Class : | |
323 { anObj = cp->klass_at(index, CATCH); | |
324 anObj->print_value_on(st); | |
325 st->print(" {0x%lx}", (address)anObj); | |
326 } | |
327 break; | |
328 case JVM_CONSTANT_Fieldref : | |
329 case JVM_CONSTANT_Methodref : | |
330 case JVM_CONSTANT_InterfaceMethodref : | |
1573
beb77f0d41b3
6957004: MethodComparator uses the wrong CP index accessor
jrose
parents:
1155
diff
changeset
|
331 st->print("klass_index=%d", cp->uncached_klass_ref_index_at(index)); |
beb77f0d41b3
6957004: MethodComparator uses the wrong CP index accessor
jrose
parents:
1155
diff
changeset
|
332 st->print(" name_and_type_index=%d", cp->uncached_name_and_type_ref_index_at(index)); |
0 | 333 break; |
334 case JVM_CONSTANT_UnresolvedString : | |
335 case JVM_CONSTANT_String : | |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
336 if (cp->is_pseudo_string_at(index)) { |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
337 anObj = cp->pseudo_string_at(index); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
338 } else { |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
339 anObj = cp->string_at(index, CATCH); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
340 } |
0 | 341 anObj->print_value_on(st); |
342 st->print(" {0x%lx}", (address)anObj); | |
343 break; | |
3368
69c94f488271
7043040: JSR292: JRuby bench/shootout/binarytrees.ruby-2.ruby SEGV: constantPoolKlass::oop_follow_contents
never
parents:
2468
diff
changeset
|
344 case JVM_CONSTANT_Object : |
69c94f488271
7043040: JSR292: JRuby bench/shootout/binarytrees.ruby-2.ruby SEGV: constantPoolKlass::oop_follow_contents
never
parents:
2468
diff
changeset
|
345 anObj = cp->object_at(index); |
69c94f488271
7043040: JSR292: JRuby bench/shootout/binarytrees.ruby-2.ruby SEGV: constantPoolKlass::oop_follow_contents
never
parents:
2468
diff
changeset
|
346 anObj->print_value_on(st); |
69c94f488271
7043040: JSR292: JRuby bench/shootout/binarytrees.ruby-2.ruby SEGV: constantPoolKlass::oop_follow_contents
never
parents:
2468
diff
changeset
|
347 st->print(" {0x%lx}", (address)anObj); |
69c94f488271
7043040: JSR292: JRuby bench/shootout/binarytrees.ruby-2.ruby SEGV: constantPoolKlass::oop_follow_contents
never
parents:
2468
diff
changeset
|
348 break; |
0 | 349 case JVM_CONSTANT_Integer : |
350 st->print("%d", cp->int_at(index)); | |
351 break; | |
352 case JVM_CONSTANT_Float : | |
353 st->print("%f", cp->float_at(index)); | |
354 break; | |
355 case JVM_CONSTANT_Long : | |
356 st->print_jlong(cp->long_at(index)); | |
357 index++; // Skip entry following eigth-byte constant | |
358 break; | |
359 case JVM_CONSTANT_Double : | |
360 st->print("%lf", cp->double_at(index)); | |
361 index++; // Skip entry following eigth-byte constant | |
362 break; | |
363 case JVM_CONSTANT_NameAndType : | |
364 st->print("name_index=%d", cp->name_ref_index_at(index)); | |
365 st->print(" signature_index=%d", cp->signature_ref_index_at(index)); | |
366 break; | |
367 case JVM_CONSTANT_Utf8 : | |
368 cp->symbol_at(index)->print_value_on(st); | |
369 break; | |
370 case JVM_CONSTANT_UnresolvedClass : // fall-through | |
371 case JVM_CONSTANT_UnresolvedClassInError: { | |
372 // unresolved_klass_at requires lock or safe world. | |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
373 CPSlot entry = cp->slot_at(index); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
374 if (entry.is_oop()) { |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
375 entry.get_oop()->print_value_on(st); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
376 } else { |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
377 entry.get_symbol()->print_value_on(st); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
378 } |
0 | 379 } |
380 break; | |
1602 | 381 case JVM_CONSTANT_MethodHandle : |
382 st->print("ref_kind=%d", cp->method_handle_ref_kind_at(index)); | |
383 st->print(" ref_index=%d", cp->method_handle_index_at(index)); | |
384 break; | |
385 case JVM_CONSTANT_MethodType : | |
386 st->print("signature_index=%d", cp->method_type_index_at(index)); | |
387 break; | |
1660
083fde3b838e
6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents:
1602
diff
changeset
|
388 case JVM_CONSTANT_InvokeDynamic : |
1913
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1713
diff
changeset
|
389 { |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1713
diff
changeset
|
390 st->print("bootstrap_method_index=%d", cp->invoke_dynamic_bootstrap_method_ref_index_at(index)); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1713
diff
changeset
|
391 st->print(" name_and_type_index=%d", cp->invoke_dynamic_name_and_type_ref_index_at(index)); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1713
diff
changeset
|
392 int argc = cp->invoke_dynamic_argument_count_at(index); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1713
diff
changeset
|
393 if (argc > 0) { |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1713
diff
changeset
|
394 for (int arg_i = 0; arg_i < argc; arg_i++) { |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1713
diff
changeset
|
395 int arg = cp->invoke_dynamic_argument_index_at(index, arg_i); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1713
diff
changeset
|
396 st->print((arg_i == 0 ? " arguments={%d" : ", %d"), arg); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1713
diff
changeset
|
397 } |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1713
diff
changeset
|
398 st->print("}"); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1713
diff
changeset
|
399 } |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1713
diff
changeset
|
400 } |
1660
083fde3b838e
6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents:
1602
diff
changeset
|
401 break; |
0 | 402 default: |
403 ShouldNotReachHere(); | |
404 break; | |
405 } | |
406 st->cr(); | |
407 } | |
408 st->cr(); | |
409 } | |
410 | |
1155
4e6abf09f540
6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents:
726
diff
changeset
|
411 void constantPoolKlass::oop_print_value_on(oop obj, outputStream* st) { |
4e6abf09f540
6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents:
726
diff
changeset
|
412 assert(obj->is_constantPool(), "must be constantPool"); |
4e6abf09f540
6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents:
726
diff
changeset
|
413 constantPoolOop cp = constantPoolOop(obj); |
4e6abf09f540
6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents:
726
diff
changeset
|
414 st->print("constant pool [%d]", cp->length()); |
4e6abf09f540
6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents:
726
diff
changeset
|
415 if (cp->has_pseudo_string()) st->print("/pseudo_string"); |
4e6abf09f540
6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents:
726
diff
changeset
|
416 if (cp->has_invokedynamic()) st->print("/invokedynamic"); |
1913
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1713
diff
changeset
|
417 if (cp->operands() != NULL) st->print("/operands[%d]", cp->operands()->length()); |
1155
4e6abf09f540
6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents:
726
diff
changeset
|
418 cp->print_address_on(st); |
4e6abf09f540
6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents:
726
diff
changeset
|
419 st->print(" for "); |
4e6abf09f540
6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents:
726
diff
changeset
|
420 cp->pool_holder()->print_value_on(st); |
1573
beb77f0d41b3
6957004: MethodComparator uses the wrong CP index accessor
jrose
parents:
1155
diff
changeset
|
421 if (cp->cache() != NULL) { |
beb77f0d41b3
6957004: MethodComparator uses the wrong CP index accessor
jrose
parents:
1155
diff
changeset
|
422 st->print(" cache=" PTR_FORMAT, cp->cache()); |
beb77f0d41b3
6957004: MethodComparator uses the wrong CP index accessor
jrose
parents:
1155
diff
changeset
|
423 } |
1155
4e6abf09f540
6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents:
726
diff
changeset
|
424 } |
0 | 425 |
426 const char* constantPoolKlass::internal_name() const { | |
427 return "{constant pool}"; | |
428 } | |
429 | |
430 // Verification | |
431 | |
432 void constantPoolKlass::oop_verify_on(oop obj, outputStream* st) { | |
433 Klass::oop_verify_on(obj, st); | |
434 guarantee(obj->is_constantPool(), "object must be constant pool"); | |
435 constantPoolOop cp = constantPoolOop(obj); | |
436 guarantee(cp->is_perm(), "should be in permspace"); | |
437 if (!cp->partially_loaded()) { | |
438 for (int i = 0; i< cp->length(); i++) { | |
3368
69c94f488271
7043040: JSR292: JRuby bench/shootout/binarytrees.ruby-2.ruby SEGV: constantPoolKlass::oop_follow_contents
never
parents:
2468
diff
changeset
|
439 constantTag tag = cp->tag_at(i); |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
440 CPSlot entry = cp->slot_at(i); |
3368
69c94f488271
7043040: JSR292: JRuby bench/shootout/binarytrees.ruby-2.ruby SEGV: constantPoolKlass::oop_follow_contents
never
parents:
2468
diff
changeset
|
441 if (tag.is_klass()) { |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
442 if (entry.is_oop()) { |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
443 guarantee(entry.get_oop()->is_perm(), "should be in permspace"); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
444 guarantee(entry.get_oop()->is_klass(), "should be klass"); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
445 } |
3368
69c94f488271
7043040: JSR292: JRuby bench/shootout/binarytrees.ruby-2.ruby SEGV: constantPoolKlass::oop_follow_contents
never
parents:
2468
diff
changeset
|
446 } else if (tag.is_unresolved_klass()) { |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
447 if (entry.is_oop()) { |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
448 guarantee(entry.get_oop()->is_perm(), "should be in permspace"); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
449 guarantee(entry.get_oop()->is_klass(), "should be klass"); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
450 } |
3368
69c94f488271
7043040: JSR292: JRuby bench/shootout/binarytrees.ruby-2.ruby SEGV: constantPoolKlass::oop_follow_contents
never
parents:
2468
diff
changeset
|
451 } else if (tag.is_symbol()) { |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
452 guarantee(entry.get_symbol()->refcount() != 0, "should have nonzero reference count"); |
3368
69c94f488271
7043040: JSR292: JRuby bench/shootout/binarytrees.ruby-2.ruby SEGV: constantPoolKlass::oop_follow_contents
never
parents:
2468
diff
changeset
|
453 } else if (tag.is_unresolved_string()) { |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
454 if (entry.is_oop()) { |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
455 guarantee(entry.get_oop()->is_perm(), "should be in permspace"); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
456 guarantee(entry.get_oop()->is_instance(), "should be instance"); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
457 } |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
458 else { |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
459 guarantee(entry.get_symbol()->refcount() != 0, "should have nonzero reference count"); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
460 } |
3368
69c94f488271
7043040: JSR292: JRuby bench/shootout/binarytrees.ruby-2.ruby SEGV: constantPoolKlass::oop_follow_contents
never
parents:
2468
diff
changeset
|
461 } else if (tag.is_string()) { |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
462 if (!cp->has_pseudo_string()) { |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
463 if (entry.is_oop()) { |
2379
b099aaf51bf8
6962931: move interned strings out of the perm gen
jcoomes
parents:
2229
diff
changeset
|
464 guarantee(!JavaObjectsInPerm || entry.get_oop()->is_perm(), |
b099aaf51bf8
6962931: move interned strings out of the perm gen
jcoomes
parents:
2229
diff
changeset
|
465 "should be in permspace"); |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
466 guarantee(entry.get_oop()->is_instance(), "should be instance"); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
467 } |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
468 } else { |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
469 // can be non-perm, can be non-instance (array) |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
196
diff
changeset
|
470 } |
3368
69c94f488271
7043040: JSR292: JRuby bench/shootout/binarytrees.ruby-2.ruby SEGV: constantPoolKlass::oop_follow_contents
never
parents:
2468
diff
changeset
|
471 } else if (tag.is_object()) { |
69c94f488271
7043040: JSR292: JRuby bench/shootout/binarytrees.ruby-2.ruby SEGV: constantPoolKlass::oop_follow_contents
never
parents:
2468
diff
changeset
|
472 assert(entry.get_oop()->is_oop(), "should be some valid oop"); |
69c94f488271
7043040: JSR292: JRuby bench/shootout/binarytrees.ruby-2.ruby SEGV: constantPoolKlass::oop_follow_contents
never
parents:
2468
diff
changeset
|
473 } else { |
69c94f488271
7043040: JSR292: JRuby bench/shootout/binarytrees.ruby-2.ruby SEGV: constantPoolKlass::oop_follow_contents
never
parents:
2468
diff
changeset
|
474 assert(!cp->is_pointer_entry(i), "unhandled oop type in constantPoolKlass::verify_on"); |
0 | 475 } |
476 } | |
477 guarantee(cp->tags()->is_perm(), "should be in permspace"); | |
478 guarantee(cp->tags()->is_typeArray(), "should be type array"); | |
479 if (cp->cache() != NULL) { | |
480 // Note: cache() can be NULL before a class is completely setup or | |
481 // in temporary constant pools used during constant pool merging | |
482 guarantee(cp->cache()->is_perm(), "should be in permspace"); | |
483 guarantee(cp->cache()->is_constantPoolCache(), "should be constant pool cache"); | |
484 } | |
1913
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1713
diff
changeset
|
485 if (cp->operands() != NULL) { |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1713
diff
changeset
|
486 guarantee(cp->operands()->is_perm(), "should be in permspace"); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1713
diff
changeset
|
487 guarantee(cp->operands()->is_typeArray(), "should be type array"); |
3b2dea75431e
6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents:
1713
diff
changeset
|
488 } |
0 | 489 if (cp->pool_holder() != NULL) { |
490 // Note: pool_holder() can be NULL in temporary constant pools | |
491 // used during constant pool merging | |
492 guarantee(cp->pool_holder()->is_perm(), "should be in permspace"); | |
493 guarantee(cp->pool_holder()->is_klass(), "should be klass"); | |
494 } | |
495 } | |
496 } | |
497 | |
498 bool constantPoolKlass::oop_partially_loaded(oop obj) const { | |
499 assert(obj->is_constantPool(), "object must be constant pool"); | |
500 constantPoolOop cp = constantPoolOop(obj); | |
501 return cp->tags() == NULL || cp->pool_holder() == (klassOop) cp; // Check whether pool holder points to self | |
502 } | |
503 | |
504 | |
505 void constantPoolKlass::oop_set_partially_loaded(oop obj) { | |
506 assert(obj->is_constantPool(), "object must be constant pool"); | |
507 constantPoolOop cp = constantPoolOop(obj); | |
508 assert(cp->pool_holder() == NULL, "just checking"); | |
509 cp->set_pool_holder((klassOop) cp); // Temporarily set pool holder to point to self | |
510 } | |
511 | |
512 #ifndef PRODUCT | |
513 // CompileTheWorld support. Preload all classes loaded references in the passed in constantpool | |
514 void constantPoolKlass::preload_and_initialize_all_classes(oop obj, TRAPS) { | |
515 guarantee(obj->is_constantPool(), "object must be constant pool"); | |
516 constantPoolHandle cp(THREAD, (constantPoolOop)obj); | |
517 guarantee(!cp->partially_loaded(), "must be fully loaded"); | |
518 | |
519 for (int i = 0; i< cp->length(); i++) { | |
520 if (cp->tag_at(i).is_unresolved_klass()) { | |
521 // This will force loading of the class | |
522 klassOop klass = cp->klass_at(i, CHECK); | |
523 if (klass->is_instance()) { | |
524 // Force initialization of class | |
525 instanceKlass::cast(klass)->initialize(CHECK); | |
526 } | |
527 } | |
528 } | |
529 } | |
530 | |
531 #endif |