Mercurial > hg > graal-compiler
annotate src/share/vm/oops/fieldStreams.hpp @ 10185:d50cc62e94ff
8012715: G1: GraphKit accesses PtrQueue::_index as int but is size_t
Summary: In graphKit INT operations were generated to access PtrQueue::_index which has type size_t. This is 64 bit on 64-bit machines. No problems occur on little endian machines as long as the index fits into 32 bit, but on big endian machines the upper part is read, which is zero. This leads to unnecessary branches to the slow path in the runtime.
Reviewed-by: twisti, johnc
Contributed-by: Martin Doerr <martin.doerr@sap.com>
author | johnc |
---|---|
date | Wed, 24 Apr 2013 14:48:43 -0700 |
parents | 4a916f2ce331 |
children | b2e698d2276c |
rev | line source |
---|---|
3938 | 1 /* |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6100
diff
changeset
|
2 * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. |
3938 | 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 */ | |
24 | |
25 #ifndef SHARE_VM_OOPS_FIELDSTREAMS_HPP | |
26 #define SHARE_VM_OOPS_FIELDSTREAMS_HPP | |
27 | |
28 #include "oops/instanceKlass.hpp" | |
29 #include "oops/fieldInfo.hpp" | |
30 | |
31 // The is the base class for iteration over the fields array | |
32 // describing the declared fields in the class. Several subclasses | |
33 // are provided depending on the kind of iteration required. The | |
34 // JavaFieldStream is for iterating over regular Java fields and it | |
35 // generally the preferred iterator. InternalFieldStream only | |
36 // iterates over fields that have been injected by the JVM. | |
37 // AllFieldStream exposes all fields and should only be used in rare | |
38 // cases. | |
39 class FieldStreamBase : public StackObj { | |
40 protected: | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6100
diff
changeset
|
41 Array<u2>* _fields; |
3938 | 42 constantPoolHandle _constants; |
43 int _index; | |
44 int _limit; | |
6100
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
45 int _generic_signature_slot; |
3938 | 46 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6100
diff
changeset
|
47 FieldInfo* field() const { return FieldInfo::from_field_array(_fields, _index); } |
3938 | 48 |
6100
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
49 int init_generic_signature_start_slot() { |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
50 int length = _fields->length(); |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
51 int num_fields = 0; |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
52 int skipped_generic_signature_slots = 0; |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
53 FieldInfo* fi; |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
54 AccessFlags flags; |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
55 /* Scan from 0 to the current _index. Count the number of generic |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
56 signature slots for field[0] to field[_index - 1]. */ |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
57 for (int i = 0; i < _index; i++) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6100
diff
changeset
|
58 fi = FieldInfo::from_field_array(_fields, i); |
6100
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
59 flags.set_flags(fi->access_flags()); |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
60 if (flags.field_has_generic_signature()) { |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
61 length --; |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
62 skipped_generic_signature_slots ++; |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
63 } |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
64 } |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
65 /* Scan from the current _index. */ |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
66 for (int i = _index; i*FieldInfo::field_slots < length; i++) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6100
diff
changeset
|
67 fi = FieldInfo::from_field_array(_fields, i); |
6100
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
68 flags.set_flags(fi->access_flags()); |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
69 if (flags.field_has_generic_signature()) { |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
70 length --; |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
71 } |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
72 num_fields ++; |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
73 } |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
74 _generic_signature_slot = length + skipped_generic_signature_slots; |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
75 assert(_generic_signature_slot <= _fields->length(), ""); |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
76 return num_fields; |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
77 } |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
78 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6100
diff
changeset
|
79 FieldStreamBase(Array<u2>* fields, constantPoolHandle constants, int start, int limit) { |
3938 | 80 _fields = fields; |
81 _constants = constants; | |
82 _index = start; | |
6100
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
83 int num_fields = init_generic_signature_start_slot(); |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
84 if (limit < start) { |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
85 _limit = num_fields; |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
86 } else { |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
87 _limit = limit; |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
88 } |
3938 | 89 } |
90 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6100
diff
changeset
|
91 FieldStreamBase(Array<u2>* fields, constantPoolHandle constants) { |
3938 | 92 _fields = fields; |
93 _constants = constants; | |
94 _index = 0; | |
6100
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
95 _limit = init_generic_signature_start_slot(); |
3938 | 96 } |
97 | |
98 public: | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6100
diff
changeset
|
99 FieldStreamBase(InstanceKlass* klass) { |
3938 | 100 _fields = klass->fields(); |
101 _constants = klass->constants(); | |
102 _index = 0; | |
103 _limit = klass->java_fields_count(); | |
6100
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
104 init_generic_signature_start_slot(); |
3938 | 105 } |
106 FieldStreamBase(instanceKlassHandle klass) { | |
107 _fields = klass->fields(); | |
108 _constants = klass->constants(); | |
109 _index = 0; | |
110 _limit = klass->java_fields_count(); | |
6100
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
111 init_generic_signature_start_slot(); |
3938 | 112 } |
113 | |
114 // accessors | |
115 int index() const { return _index; } | |
116 | |
6100
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
117 void next() { |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
118 if (access_flags().field_has_generic_signature()) { |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
119 _generic_signature_slot ++; |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
120 assert(_generic_signature_slot <= _fields->length(), ""); |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
121 } |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
122 _index += 1; |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
123 } |
3938 | 124 bool done() const { return _index >= _limit; } |
125 | |
126 // Accessors for current field | |
127 AccessFlags access_flags() const { | |
128 AccessFlags flags; | |
129 flags.set_flags(field()->access_flags()); | |
130 return flags; | |
131 } | |
132 | |
133 void set_access_flags(u2 flags) const { | |
134 field()->set_access_flags(flags); | |
135 } | |
136 | |
137 void set_access_flags(AccessFlags flags) const { | |
138 set_access_flags(flags.as_short()); | |
139 } | |
140 | |
141 Symbol* name() const { | |
142 return field()->name(_constants); | |
143 } | |
144 | |
145 Symbol* signature() const { | |
146 return field()->signature(_constants); | |
147 } | |
148 | |
149 Symbol* generic_signature() const { | |
6100
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
150 if (access_flags().field_has_generic_signature()) { |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
151 assert(_generic_signature_slot < _fields->length(), "out of bounds"); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6100
diff
changeset
|
152 int index = _fields->at(_generic_signature_slot); |
6100
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
153 return _constants->symbol_at(index); |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
154 } else { |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
155 return NULL; |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
156 } |
3938 | 157 } |
158 | |
159 int offset() const { | |
160 return field()->offset(); | |
161 } | |
162 | |
7587 | 163 int allocation_type() const { |
164 return field()->allocation_type(); | |
165 } | |
166 | |
3938 | 167 void set_offset(int offset) { |
168 field()->set_offset(offset); | |
169 } | |
7587 | 170 |
171 bool is_offset_set() const { | |
172 return field()->is_offset_set(); | |
173 } | |
174 | |
175 bool is_contended() const { | |
176 return field()->is_contended(); | |
177 } | |
178 | |
179 int contended_group() const { | |
180 return field()->contended_group(); | |
181 } | |
182 | |
3938 | 183 }; |
184 | |
185 // Iterate over only the internal fields | |
186 class JavaFieldStream : public FieldStreamBase { | |
187 public: | |
188 JavaFieldStream(instanceKlassHandle k): FieldStreamBase(k->fields(), k->constants(), 0, k->java_fields_count()) {} | |
189 | |
190 int name_index() const { | |
191 assert(!field()->is_internal(), "regular only"); | |
192 return field()->name_index(); | |
193 } | |
194 void set_name_index(int index) { | |
195 assert(!field()->is_internal(), "regular only"); | |
196 field()->set_name_index(index); | |
197 } | |
198 int signature_index() const { | |
199 assert(!field()->is_internal(), "regular only"); | |
200 return field()->signature_index(); | |
201 } | |
202 void set_signature_index(int index) { | |
203 assert(!field()->is_internal(), "regular only"); | |
204 field()->set_signature_index(index); | |
205 } | |
206 int generic_signature_index() const { | |
207 assert(!field()->is_internal(), "regular only"); | |
6100
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
208 if (access_flags().field_has_generic_signature()) { |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
209 assert(_generic_signature_slot < _fields->length(), "out of bounds"); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6100
diff
changeset
|
210 return _fields->at(_generic_signature_slot); |
6100
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
211 } else { |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
212 return 0; |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
213 } |
3938 | 214 } |
215 void set_generic_signature_index(int index) { | |
216 assert(!field()->is_internal(), "regular only"); | |
6100
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
217 if (access_flags().field_has_generic_signature()) { |
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
218 assert(_generic_signature_slot < _fields->length(), "out of bounds"); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6100
diff
changeset
|
219 _fields->at_put(_generic_signature_slot, index); |
6100
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
220 } |
3938 | 221 } |
222 int initval_index() const { | |
223 assert(!field()->is_internal(), "regular only"); | |
224 return field()->initval_index(); | |
225 } | |
226 void set_initval_index(int index) { | |
227 assert(!field()->is_internal(), "regular only"); | |
228 return field()->set_initval_index(index); | |
229 } | |
230 }; | |
231 | |
232 | |
233 // Iterate over only the internal fields | |
234 class InternalFieldStream : public FieldStreamBase { | |
235 public: | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6100
diff
changeset
|
236 InternalFieldStream(InstanceKlass* k): FieldStreamBase(k->fields(), k->constants(), k->java_fields_count(), 0) {} |
6100
71afdabfd05b
7168280: Eliminate the generic signature index slot from field array for field without generic signature.
jiangli
parents:
3938
diff
changeset
|
237 InternalFieldStream(instanceKlassHandle k): FieldStreamBase(k->fields(), k->constants(), k->java_fields_count(), 0) {} |
3938 | 238 }; |
239 | |
240 | |
241 class AllFieldStream : public FieldStreamBase { | |
242 public: | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6100
diff
changeset
|
243 AllFieldStream(Array<u2>* fields, constantPoolHandle constants): FieldStreamBase(fields, constants) {} |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6100
diff
changeset
|
244 AllFieldStream(InstanceKlass* k): FieldStreamBase(k->fields(), k->constants()) {} |
3938 | 245 AllFieldStream(instanceKlassHandle k): FieldStreamBase(k->fields(), k->constants()) {} |
246 }; | |
247 | |
248 #endif // SHARE_VM_OOPS_FIELDSTREAMS_HPP |