Mercurial > hg > truffle
annotate src/share/vm/ci/ciInstanceKlass.hpp @ 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 | f95d63e2154a |
children | 06f017f7daa7 49036505ab5f |
rev | line source |
---|---|
0 | 1 /* |
1645
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
2 * Copyright (c) 1999, 2010, 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:
1138
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1138
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:
1138
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_CI_CIINSTANCEKLASS_HPP |
26 #define SHARE_VM_CI_CIINSTANCEKLASS_HPP | |
27 | |
28 #include "ci/ciConstantPoolCache.hpp" | |
29 #include "ci/ciFlags.hpp" | |
30 #include "ci/ciInstanceKlassKlass.hpp" | |
31 #include "ci/ciKlass.hpp" | |
32 #include "ci/ciSymbol.hpp" | |
33 | |
0 | 34 // ciInstanceKlass |
35 // | |
36 // This class represents a klassOop in the HotSpot virtual machine | |
37 // whose Klass part is an instanceKlass. It may or may not | |
38 // be loaded. | |
39 class ciInstanceKlass : public ciKlass { | |
40 CI_PACKAGE_ACCESS | |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1080
diff
changeset
|
41 friend class ciBytecodeStream; |
0 | 42 friend class ciEnv; |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1080
diff
changeset
|
43 friend class ciExceptionHandler; |
0 | 44 friend class ciMethod; |
45 friend class ciField; | |
46 | |
47 private: | |
48 jobject _loader; | |
49 jobject _protection_domain; | |
50 | |
1645
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
51 instanceKlass::ClassState _init_state; // state of class |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
44
diff
changeset
|
52 bool _is_shared; |
0 | 53 bool _has_finalizer; |
54 bool _has_subklass; | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
44
diff
changeset
|
55 bool _has_nonstatic_fields; |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
44
diff
changeset
|
56 |
0 | 57 ciFlags _flags; |
58 jint _nonstatic_field_size; | |
44
52fed2ec0afb
6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents:
0
diff
changeset
|
59 jint _nonstatic_oop_map_size; |
0 | 60 |
61 // Lazy fields get filled in only upon request. | |
62 ciInstanceKlass* _super; | |
63 ciInstance* _java_mirror; | |
64 | |
65 ciConstantPoolCache* _field_cache; // cached map index->field | |
66 GrowableArray<ciField*>* _nonstatic_fields; | |
67 | |
68 enum { implementors_limit = instanceKlass::implementors_limit }; | |
69 ciInstanceKlass* _implementors[implementors_limit]; | |
70 jint _nof_implementors; | |
71 | |
44
52fed2ec0afb
6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents:
0
diff
changeset
|
72 GrowableArray<ciField*>* _non_static_fields; |
52fed2ec0afb
6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents:
0
diff
changeset
|
73 |
0 | 74 protected: |
75 ciInstanceKlass(KlassHandle h_k); | |
76 ciInstanceKlass(ciSymbol* name, jobject loader, jobject protection_domain); | |
77 | |
78 instanceKlass* get_instanceKlass() const { | |
79 return (instanceKlass*)get_Klass(); | |
80 } | |
81 | |
82 oop loader(); | |
83 jobject loader_handle(); | |
84 | |
85 oop protection_domain(); | |
86 jobject protection_domain_handle(); | |
87 | |
88 const char* type_string() { return "ciInstanceKlass"; } | |
89 | |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1080
diff
changeset
|
90 bool is_in_package_impl(const char* packagename, int len); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1080
diff
changeset
|
91 |
0 | 92 void print_impl(outputStream* st); |
93 | |
94 ciConstantPoolCache* field_cache(); | |
95 | |
96 bool is_shared() { return _is_shared; } | |
97 | |
1645
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
98 void compute_shared_init_state(); |
0 | 99 bool compute_shared_has_subklass(); |
100 int compute_shared_nof_implementors(); | |
101 int compute_nonstatic_fields(); | |
102 GrowableArray<ciField*>* compute_nonstatic_fields_impl(GrowableArray<ciField*>* super_fields); | |
103 | |
1645
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
104 // Update the init_state for shared klasses |
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
105 void update_if_shared(instanceKlass::ClassState expected) { |
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
106 if (_is_shared && _init_state != expected) { |
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
107 if (is_loaded()) compute_shared_init_state(); |
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
108 } |
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
109 } |
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
110 |
0 | 111 public: |
112 // Has this klass been initialized? | |
113 bool is_initialized() { | |
1645
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
114 update_if_shared(instanceKlass::fully_initialized); |
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
115 return _init_state == instanceKlass::fully_initialized; |
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
116 } |
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
117 // Is this klass being initialized? |
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
118 bool is_being_initialized() { |
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
119 update_if_shared(instanceKlass::being_initialized); |
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
120 return _init_state == instanceKlass::being_initialized; |
0 | 121 } |
122 // Has this klass been linked? | |
123 bool is_linked() { | |
1645
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
124 update_if_shared(instanceKlass::linked); |
3941674cc7fa
6958668: repeated uncommon trapping for new of klass which is being initialized
never
parents:
1552
diff
changeset
|
125 return _init_state >= instanceKlass::linked; |
0 | 126 } |
127 | |
128 // General klass information. | |
129 ciFlags flags() { | |
130 assert(is_loaded(), "must be loaded"); | |
131 return _flags; | |
132 } | |
133 bool has_finalizer() { | |
134 assert(is_loaded(), "must be loaded"); | |
135 return _has_finalizer; } | |
136 bool has_subklass() { | |
137 assert(is_loaded(), "must be loaded"); | |
138 if (_is_shared && !_has_subklass) { | |
139 if (flags().is_final()) { | |
140 return false; | |
141 } else { | |
142 return compute_shared_has_subklass(); | |
143 } | |
144 } | |
145 return _has_subklass; | |
146 } | |
147 jint size_helper() { | |
148 return (Klass::layout_helper_size_in_bytes(layout_helper()) | |
149 >> LogHeapWordSize); | |
150 } | |
151 jint nonstatic_field_size() { | |
152 assert(is_loaded(), "must be loaded"); | |
153 return _nonstatic_field_size; } | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
44
diff
changeset
|
154 jint has_nonstatic_fields() { |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
44
diff
changeset
|
155 assert(is_loaded(), "must be loaded"); |
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
44
diff
changeset
|
156 return _has_nonstatic_fields; } |
44
52fed2ec0afb
6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents:
0
diff
changeset
|
157 jint nonstatic_oop_map_size() { |
52fed2ec0afb
6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents:
0
diff
changeset
|
158 assert(is_loaded(), "must be loaded"); |
52fed2ec0afb
6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents:
0
diff
changeset
|
159 return _nonstatic_oop_map_size; } |
0 | 160 ciInstanceKlass* super(); |
161 jint nof_implementors() { | |
162 assert(is_loaded(), "must be loaded"); | |
163 if (_is_shared) return compute_shared_nof_implementors(); | |
164 return _nof_implementors; | |
165 } | |
166 | |
167 ciInstanceKlass* get_canonical_holder(int offset); | |
168 ciField* get_field_by_offset(int field_offset, bool is_static); | |
1080
7c57aead6d3e
6892658: C2 should optimize some stringbuilder patterns
never
parents:
196
diff
changeset
|
169 ciField* get_field_by_name(ciSymbol* name, ciSymbol* signature, bool is_static); |
44
52fed2ec0afb
6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents:
0
diff
changeset
|
170 |
52fed2ec0afb
6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents:
0
diff
changeset
|
171 GrowableArray<ciField*>* non_static_fields(); |
52fed2ec0afb
6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents:
0
diff
changeset
|
172 |
0 | 173 // total number of nonstatic fields (including inherited): |
174 int nof_nonstatic_fields() { | |
175 if (_nonstatic_fields == NULL) | |
176 return compute_nonstatic_fields(); | |
177 else | |
178 return _nonstatic_fields->length(); | |
179 } | |
180 // nth nonstatic field (presented by ascending address) | |
181 ciField* nonstatic_field_at(int i) { | |
182 assert(_nonstatic_fields != NULL, ""); | |
183 return _nonstatic_fields->at(i); | |
184 } | |
185 | |
186 ciInstanceKlass* unique_concrete_subklass(); | |
187 bool has_finalizable_subclass(); | |
188 | |
189 bool contains_field_offset(int offset) { | |
113
ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents:
44
diff
changeset
|
190 return instanceOopDesc::contains_field_offset(offset, nonstatic_field_size()); |
0 | 191 } |
192 | |
193 // Get the instance of java.lang.Class corresponding to | |
194 // this klass. This instance is used for locking of | |
195 // synchronized static methods of this klass. | |
196 ciInstance* java_mirror(); | |
197 | |
198 // Java access flags | |
199 bool is_public () { return flags().is_public(); } | |
200 bool is_final () { return flags().is_final(); } | |
201 bool is_super () { return flags().is_super(); } | |
202 bool is_interface () { return flags().is_interface(); } | |
203 bool is_abstract () { return flags().is_abstract(); } | |
204 | |
205 ciMethod* find_method(ciSymbol* name, ciSymbol* signature); | |
206 // Note: To find a method from name and type strings, use ciSymbol::make, | |
207 // but consider adding to vmSymbols.hpp instead. | |
208 | |
209 bool is_leaf_type(); | |
210 ciInstanceKlass* implementor(int n); | |
211 | |
212 // Is the defining class loader of this class the default loader? | |
213 bool uses_default_loader(); | |
214 | |
215 bool is_java_lang_Object(); | |
216 | |
1138
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1080
diff
changeset
|
217 // Is this klass in the given package? |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1080
diff
changeset
|
218 bool is_in_package(const char* packagename) { |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1080
diff
changeset
|
219 return is_in_package(packagename, (int) strlen(packagename)); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1080
diff
changeset
|
220 } |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1080
diff
changeset
|
221 bool is_in_package(const char* packagename, int len); |
dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
twisti
parents:
1080
diff
changeset
|
222 |
0 | 223 // What kind of ciObject is this? |
224 bool is_instance_klass() { return true; } | |
225 bool is_java_klass() { return true; } | |
226 }; | |
1972 | 227 |
228 #endif // SHARE_VM_CI_CIINSTANCEKLASS_HPP |