annotate src/share/vm/oops/cpCacheOop.hpp @ 452:00b023ae2d78

6722113: CMS: Incorrect overflow handling during precleaning of Reference lists Summary: When we encounter marking stack overflow during precleaning of Reference lists, we were using the overflow list mechanism, which can cause problems on account of mutating the mark word of the header because of conflicts with mutator accesses and updates of that field. Instead we should use the usual mechanism for overflow handling in concurrent phases, namely dirtying of the card on which the overflowed object lies. Since precleaning effectively does a form of discovered list processing, albeit with discovery enabled, we needed to adjust some code to be correct in the face of interleaved processing and discovery. Reviewed-by: apetrusenko, jcoomes
author ysr
date Thu, 20 Nov 2008 12:27:41 -0800
parents d1605aabd0a1
children 9a25e0c45327
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
196
d1605aabd0a1 6719955: Update copyright year
xdono
parents: 113
diff changeset
2 * Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 // A ConstantPoolCacheEntry describes an individual entry of the constant
a61af66fc99e Initial load
duke
parents:
diff changeset
26 // pool cache. There's 2 principal kinds of entries: field entries for in-
a61af66fc99e Initial load
duke
parents:
diff changeset
27 // stance & static field access, and method entries for invokes. Some of
a61af66fc99e Initial load
duke
parents:
diff changeset
28 // the entry layout is shared and looks as follows:
a61af66fc99e Initial load
duke
parents:
diff changeset
29 //
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // bit number |31 0|
a61af66fc99e Initial load
duke
parents:
diff changeset
31 // bit length |-8--|-8--|---16----|
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // --------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // _indices [ b2 | b1 | index ]
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // _f1 [ entry specific ]
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // _f2 [ entry specific ]
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // _flags [t|f|vf|v|m|h|unused|field_index] (for field entries)
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // bit length |4|1|1 |1|1|0|---7--|----16-----]
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // _flags [t|f|vf|v|m|h|unused|eidx|psze] (for method entries)
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // bit length |4|1|1 |1|1|1|---7--|-8--|-8--]
a61af66fc99e Initial load
duke
parents:
diff changeset
40
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // --------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
42 //
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // with:
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // index = original constant pool index
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // b1 = bytecode 1
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // b2 = bytecode 2
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // psze = parameters size (method entries only)
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // eidx = interpreter entry index (method entries only)
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // field_index = index into field information in holder instanceKlass
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // The index max is 0xffff (max number of fields in constant pool)
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // and is multiplied by (instanceKlass::next_offset) when accessing.
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // t = TosState (see below)
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // f = field is marked final (see below)
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // vf = virtual, final (method entries only : is_vfinal())
a61af66fc99e Initial load
duke
parents:
diff changeset
55 // v = field is volatile (see below)
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // m = invokeinterface used for method in class Object (see below)
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // h = RedefineClasses/Hotswap bit (see below)
a61af66fc99e Initial load
duke
parents:
diff changeset
58 //
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // The flags after TosState have the following interpretation:
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // bit 27: f flag true if field is marked final
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // bit 26: vf flag true if virtual final method
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // bit 25: v flag true if field is volatile (only for fields)
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // bit 24: m flag true if invokeinterface used for method in class Object
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // bit 23: 0 for fields, 1 for methods
a61af66fc99e Initial load
duke
parents:
diff changeset
65 //
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // The flags 31, 30, 29, 28 together build a 4 bit number 0 to 8 with the
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // following mapping to the TosState states:
a61af66fc99e Initial load
duke
parents:
diff changeset
68 //
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // btos: 0
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // ctos: 1
a61af66fc99e Initial load
duke
parents:
diff changeset
71 // stos: 2
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // itos: 3
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // ltos: 4
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // ftos: 5
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // dtos: 6
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // atos: 7
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // vtos: 8
a61af66fc99e Initial load
duke
parents:
diff changeset
78 //
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // Entry specific: field entries:
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // _indices = get (b1 section) and put (b2 section) bytecodes, original constant pool index
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // _f1 = field holder
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // _f2 = field offset in words
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // _flags = field type information, original field index in field holder
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // (field_index section)
a61af66fc99e Initial load
duke
parents:
diff changeset
85 //
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // Entry specific: method entries:
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // _indices = invoke code for f1 (b1 section), invoke code for f2 (b2 section),
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // original constant pool index
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // _f1 = method for all but virtual calls, unused by virtual calls
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // (note: for interface calls, which are essentially virtual,
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // contains klassOop for the corresponding interface.
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // _f2 = method/vtable index for virtual calls only, unused by all other
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // calls. The vf flag indicates this is a method pointer not an
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // index.
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // _flags = field type info (f section),
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // virtual final entry (vf),
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // interpreter entry index (eidx section),
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // parameter size (psze section)
a61af66fc99e Initial load
duke
parents:
diff changeset
99 //
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // Note: invokevirtual & invokespecial bytecodes can share the same constant
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // pool entry and thus the same constant pool cache entry. All invoke
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // bytecodes but invokevirtual use only _f1 and the corresponding b1
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // bytecode, while invokevirtual uses only _f2 and the corresponding
a61af66fc99e Initial load
duke
parents:
diff changeset
104 // b2 bytecode. The value of _flags is shared for both types of entries.
a61af66fc99e Initial load
duke
parents:
diff changeset
105 //
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // The fields are volatile so that they are stored in the order written in the
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // source code. The _indices field with the bytecode must be written last.
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 class ConstantPoolCacheEntry VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
110 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
111 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
112 volatile intx _indices; // constant pool index & rewrite bytecodes
a61af66fc99e Initial load
duke
parents:
diff changeset
113 volatile oop _f1; // entry specific oop field
a61af66fc99e Initial load
duke
parents:
diff changeset
114 volatile intx _f2; // entry specific int/oop field
a61af66fc99e Initial load
duke
parents:
diff changeset
115 volatile intx _flags; // flags
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
119 bool same_methodOop(oop cur_f1, oop f1);
a61af66fc99e Initial load
duke
parents:
diff changeset
120 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122 void set_bytecode_1(Bytecodes::Code code);
a61af66fc99e Initial load
duke
parents:
diff changeset
123 void set_bytecode_2(Bytecodes::Code code);
a61af66fc99e Initial load
duke
parents:
diff changeset
124 void set_f1(oop f1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
125 oop existing_f1 = _f1; // read once
a61af66fc99e Initial load
duke
parents:
diff changeset
126 assert(existing_f1 == NULL || existing_f1 == f1, "illegal field change");
a61af66fc99e Initial load
duke
parents:
diff changeset
127 oop_store(&_f1, f1);
a61af66fc99e Initial load
duke
parents:
diff changeset
128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
129 void set_f2(intx f2) { assert(_f2 == 0 || _f2 == f2, "illegal field change"); _f2 = f2; }
a61af66fc99e Initial load
duke
parents:
diff changeset
130 int as_flags(TosState state, bool is_final, bool is_vfinal, bool is_volatile,
a61af66fc99e Initial load
duke
parents:
diff changeset
131 bool is_method_interface, bool is_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
132 void set_flags(intx flags) { _flags = flags; }
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
135 // specific bit values in flag field
a61af66fc99e Initial load
duke
parents:
diff changeset
136 // Note: the interpreter knows this layout!
a61af66fc99e Initial load
duke
parents:
diff changeset
137 enum FlagBitValues {
a61af66fc99e Initial load
duke
parents:
diff changeset
138 hotSwapBit = 23,
a61af66fc99e Initial load
duke
parents:
diff changeset
139 methodInterface = 24,
a61af66fc99e Initial load
duke
parents:
diff changeset
140 volatileField = 25,
a61af66fc99e Initial load
duke
parents:
diff changeset
141 vfinalMethod = 26,
a61af66fc99e Initial load
duke
parents:
diff changeset
142 finalField = 27
a61af66fc99e Initial load
duke
parents:
diff changeset
143 };
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 enum { field_index_mask = 0xFFFF };
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // start of type bits in flags
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // Note: the interpreter knows this layout!
a61af66fc99e Initial load
duke
parents:
diff changeset
149 enum FlagValues {
a61af66fc99e Initial load
duke
parents:
diff changeset
150 tosBits = 28
a61af66fc99e Initial load
duke
parents:
diff changeset
151 };
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // Initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
154 void set_initial_state(int index); // sets entry to initial state
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 void set_field( // sets entry to resolved field state
a61af66fc99e Initial load
duke
parents:
diff changeset
157 Bytecodes::Code get_code, // the bytecode used for reading the field
a61af66fc99e Initial load
duke
parents:
diff changeset
158 Bytecodes::Code put_code, // the bytecode used for writing the field
a61af66fc99e Initial load
duke
parents:
diff changeset
159 KlassHandle field_holder, // the object/klass holding the field
a61af66fc99e Initial load
duke
parents:
diff changeset
160 int orig_field_index, // the original field index in the field holder
a61af66fc99e Initial load
duke
parents:
diff changeset
161 int field_offset, // the field offset in words in the field holder
a61af66fc99e Initial load
duke
parents:
diff changeset
162 TosState field_type, // the (machine) field type
a61af66fc99e Initial load
duke
parents:
diff changeset
163 bool is_final, // the field is final
a61af66fc99e Initial load
duke
parents:
diff changeset
164 bool is_volatile // the field is volatile
a61af66fc99e Initial load
duke
parents:
diff changeset
165 );
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 void set_method( // sets entry to resolved method entry
a61af66fc99e Initial load
duke
parents:
diff changeset
168 Bytecodes::Code invoke_code, // the bytecode used for invoking the method
a61af66fc99e Initial load
duke
parents:
diff changeset
169 methodHandle method, // the method/prototype if any (NULL, otherwise)
a61af66fc99e Initial load
duke
parents:
diff changeset
170 int vtable_index // the vtable index if any, else negative
a61af66fc99e Initial load
duke
parents:
diff changeset
171 );
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 void set_interface_call(
a61af66fc99e Initial load
duke
parents:
diff changeset
174 methodHandle method, // Resolved method
a61af66fc99e Initial load
duke
parents:
diff changeset
175 int index // Method index into interface
a61af66fc99e Initial load
duke
parents:
diff changeset
176 );
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 void set_parameter_size(int value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
179 assert(parameter_size() == 0 || parameter_size() == value,
a61af66fc99e Initial load
duke
parents:
diff changeset
180 "size must not change");
a61af66fc99e Initial load
duke
parents:
diff changeset
181 // Setting the parameter size by itself is only safe if the
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // current value of _flags is 0, otherwise another thread may have
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // updated it and we don't want to overwrite that value. Don't
a61af66fc99e Initial load
duke
parents:
diff changeset
184 // bother trying to update it once it's nonzero but always make
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // sure that the final parameter size agrees with what was passed.
a61af66fc99e Initial load
duke
parents:
diff changeset
186 if (_flags == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
187 Atomic::cmpxchg_ptr((value & 0xFF), &_flags, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
188 }
a61af66fc99e Initial load
duke
parents:
diff changeset
189 guarantee(parameter_size() == value, "size must not change");
a61af66fc99e Initial load
duke
parents:
diff changeset
190 }
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 // Which bytecode number (1 or 2) in the index field is valid for this bytecode?
a61af66fc99e Initial load
duke
parents:
diff changeset
193 // Returns -1 if neither is valid.
a61af66fc99e Initial load
duke
parents:
diff changeset
194 static int bytecode_number(Bytecodes::Code code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
195 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
196 case Bytecodes::_getstatic : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
197 case Bytecodes::_getfield : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
198 case Bytecodes::_invokespecial : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
199 case Bytecodes::_invokestatic : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
200 case Bytecodes::_invokeinterface : return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
201 case Bytecodes::_putstatic : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
202 case Bytecodes::_putfield : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
203 case Bytecodes::_invokevirtual : return 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
204 default : break;
a61af66fc99e Initial load
duke
parents:
diff changeset
205 }
a61af66fc99e Initial load
duke
parents:
diff changeset
206 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
207 }
a61af66fc99e Initial load
duke
parents:
diff changeset
208
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // Has this bytecode been resolved? Only valid for invokes and get/put field/static.
a61af66fc99e Initial load
duke
parents:
diff changeset
210 bool is_resolved(Bytecodes::Code code) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
211 switch (bytecode_number(code)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
212 case 1: return (bytecode_1() == code);
a61af66fc99e Initial load
duke
parents:
diff changeset
213 case 2: return (bytecode_2() == code);
a61af66fc99e Initial load
duke
parents:
diff changeset
214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
215 return false; // default: not resolved
a61af66fc99e Initial load
duke
parents:
diff changeset
216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
219 int constant_pool_index() const { return _indices & 0xFFFF; }
a61af66fc99e Initial load
duke
parents:
diff changeset
220 Bytecodes::Code bytecode_1() const { return Bytecodes::cast((_indices >> 16) & 0xFF); }
a61af66fc99e Initial load
duke
parents:
diff changeset
221 Bytecodes::Code bytecode_2() const { return Bytecodes::cast((_indices >> 24) & 0xFF); }
a61af66fc99e Initial load
duke
parents:
diff changeset
222 volatile oop f1() const { return _f1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
223 intx f2() const { return _f2; }
a61af66fc99e Initial load
duke
parents:
diff changeset
224 int field_index() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
225 int parameter_size() const { return _flags & 0xFF; }
a61af66fc99e Initial load
duke
parents:
diff changeset
226 bool is_vfinal() const { return ((_flags & (1 << vfinalMethod)) == (1 << vfinalMethod)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
227 bool is_volatile() const { return ((_flags & (1 << volatileField)) == (1 << volatileField)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
228 bool is_methodInterface() const { return ((_flags & (1 << methodInterface)) == (1 << methodInterface)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
229 bool is_byte() const { return (((uintx) _flags >> tosBits) == btos); }
a61af66fc99e Initial load
duke
parents:
diff changeset
230 bool is_char() const { return (((uintx) _flags >> tosBits) == ctos); }
a61af66fc99e Initial load
duke
parents:
diff changeset
231 bool is_short() const { return (((uintx) _flags >> tosBits) == stos); }
a61af66fc99e Initial load
duke
parents:
diff changeset
232 bool is_int() const { return (((uintx) _flags >> tosBits) == itos); }
a61af66fc99e Initial load
duke
parents:
diff changeset
233 bool is_long() const { return (((uintx) _flags >> tosBits) == ltos); }
a61af66fc99e Initial load
duke
parents:
diff changeset
234 bool is_float() const { return (((uintx) _flags >> tosBits) == ftos); }
a61af66fc99e Initial load
duke
parents:
diff changeset
235 bool is_double() const { return (((uintx) _flags >> tosBits) == dtos); }
a61af66fc99e Initial load
duke
parents:
diff changeset
236 bool is_object() const { return (((uintx) _flags >> tosBits) == atos); }
a61af66fc99e Initial load
duke
parents:
diff changeset
237 TosState flag_state() const { assert( ( (_flags >> tosBits) & 0x0F ) < number_of_states, "Invalid state in as_flags");
a61af66fc99e Initial load
duke
parents:
diff changeset
238 return (TosState)((_flags >> tosBits) & 0x0F); }
a61af66fc99e Initial load
duke
parents:
diff changeset
239
a61af66fc99e Initial load
duke
parents:
diff changeset
240 // Code generation support
a61af66fc99e Initial load
duke
parents:
diff changeset
241 static WordSize size() { return in_WordSize(sizeof(ConstantPoolCacheEntry) / HeapWordSize); }
a61af66fc99e Initial load
duke
parents:
diff changeset
242 static ByteSize indices_offset() { return byte_offset_of(ConstantPoolCacheEntry, _indices); }
a61af66fc99e Initial load
duke
parents:
diff changeset
243 static ByteSize f1_offset() { return byte_offset_of(ConstantPoolCacheEntry, _f1); }
a61af66fc99e Initial load
duke
parents:
diff changeset
244 static ByteSize f2_offset() { return byte_offset_of(ConstantPoolCacheEntry, _f2); }
a61af66fc99e Initial load
duke
parents:
diff changeset
245 static ByteSize flags_offset() { return byte_offset_of(ConstantPoolCacheEntry, _flags); }
a61af66fc99e Initial load
duke
parents:
diff changeset
246
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // GC Support
a61af66fc99e Initial load
duke
parents:
diff changeset
248 void oops_do(void f(oop*));
a61af66fc99e Initial load
duke
parents:
diff changeset
249 void oop_iterate(OopClosure* blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
250 void oop_iterate_m(OopClosure* blk, MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
251 void follow_contents();
a61af66fc99e Initial load
duke
parents:
diff changeset
252 void adjust_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
253
a61af66fc99e Initial load
duke
parents:
diff changeset
254 #ifndef SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
255 // Parallel Old
a61af66fc99e Initial load
duke
parents:
diff changeset
256 void follow_contents(ParCompactionManager* cm);
a61af66fc99e Initial load
duke
parents:
diff changeset
257 #endif // SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
258
a61af66fc99e Initial load
duke
parents:
diff changeset
259 void update_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
260 void update_pointers(HeapWord* beg_addr, HeapWord* end_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262 // RedefineClasses() API support:
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // If this constantPoolCacheEntry refers to old_method then update it
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // to refer to new_method.
a61af66fc99e Initial load
duke
parents:
diff changeset
265 // trace_name_printed is set to true if the current call has
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // printed the klass name so that other routines in the adjust_*
a61af66fc99e Initial load
duke
parents:
diff changeset
267 // group don't print the klass name.
a61af66fc99e Initial load
duke
parents:
diff changeset
268 bool adjust_method_entry(methodOop old_method, methodOop new_method,
a61af66fc99e Initial load
duke
parents:
diff changeset
269 bool * trace_name_printed);
a61af66fc99e Initial load
duke
parents:
diff changeset
270 bool is_interesting_method_entry(klassOop k);
a61af66fc99e Initial load
duke
parents:
diff changeset
271 bool is_field_entry() const { return (_flags & (1 << hotSwapBit)) == 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
272 bool is_method_entry() const { return (_flags & (1 << hotSwapBit)) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274 // Debugging & Printing
a61af66fc99e Initial load
duke
parents:
diff changeset
275 void print (outputStream* st, int index) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
276 void verify(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
277
a61af66fc99e Initial load
duke
parents:
diff changeset
278 static void verify_tosBits() {
a61af66fc99e Initial load
duke
parents:
diff changeset
279 assert(tosBits == 28, "interpreter now assumes tosBits is 28");
a61af66fc99e Initial load
duke
parents:
diff changeset
280 }
a61af66fc99e Initial load
duke
parents:
diff changeset
281 };
a61af66fc99e Initial load
duke
parents:
diff changeset
282
a61af66fc99e Initial load
duke
parents:
diff changeset
283
a61af66fc99e Initial load
duke
parents:
diff changeset
284 // A constant pool cache is a runtime data structure set aside to a constant pool. The cache
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // holds interpreter runtime information for all field access and invoke bytecodes. The cache
a61af66fc99e Initial load
duke
parents:
diff changeset
286 // is created and initialized before a class is actively used (i.e., initialized), the indivi-
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // dual cache entries are filled at resolution (i.e., "link") time (see also: rewriter.*).
a61af66fc99e Initial load
duke
parents:
diff changeset
288
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
289 class constantPoolCacheOopDesc: public oopDesc {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
290 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
291 private:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
292 int _length;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
293 constantPoolOop _constant_pool; // the corresponding constant pool
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // Sizing
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
296 debug_only(friend class ClassVerifier;)
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
297 int length() const { return _length; }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
298 void set_length(int length) { _length = length; }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
299
0
a61af66fc99e Initial load
duke
parents:
diff changeset
300 static int header_size() { return sizeof(constantPoolCacheOopDesc) / HeapWordSize; }
a61af66fc99e Initial load
duke
parents:
diff changeset
301 static int object_size(int length) { return align_object_size(header_size() + length * in_words(ConstantPoolCacheEntry::size())); }
a61af66fc99e Initial load
duke
parents:
diff changeset
302 int object_size() { return object_size(length()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
303
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // Helpers
a61af66fc99e Initial load
duke
parents:
diff changeset
305 constantPoolOop* constant_pool_addr() { return &_constant_pool; }
a61af66fc99e Initial load
duke
parents:
diff changeset
306 ConstantPoolCacheEntry* base() const { return (ConstantPoolCacheEntry*)((address)this + in_bytes(base_offset())); }
a61af66fc99e Initial load
duke
parents:
diff changeset
307
a61af66fc99e Initial load
duke
parents:
diff changeset
308 friend class constantPoolCacheKlass;
a61af66fc99e Initial load
duke
parents:
diff changeset
309
a61af66fc99e Initial load
duke
parents:
diff changeset
310 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
311 // Initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
312 void initialize(intArray& inverse_index_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
313
a61af66fc99e Initial load
duke
parents:
diff changeset
314 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
315 void set_constant_pool(constantPoolOop pool) { oop_store_without_check((oop*)&_constant_pool, (oop)pool); }
a61af66fc99e Initial load
duke
parents:
diff changeset
316 constantPoolOop constant_pool() const { return _constant_pool; }
a61af66fc99e Initial load
duke
parents:
diff changeset
317 ConstantPoolCacheEntry* entry_at(int i) const { assert(0 <= i && i < length(), "index out of bounds"); return base() + i; }
a61af66fc99e Initial load
duke
parents:
diff changeset
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319 // Code generation
a61af66fc99e Initial load
duke
parents:
diff changeset
320 static ByteSize base_offset() { return in_ByteSize(sizeof(constantPoolCacheOopDesc)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
321
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // RedefineClasses() API support:
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // If any entry of this constantPoolCache points to any of
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // old_methods, replace it with the corresponding new_method.
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // trace_name_printed is set to true if the current call has
a61af66fc99e Initial load
duke
parents:
diff changeset
326 // printed the klass name so that other routines in the adjust_*
a61af66fc99e Initial load
duke
parents:
diff changeset
327 // group don't print the klass name.
a61af66fc99e Initial load
duke
parents:
diff changeset
328 void adjust_method_entries(methodOop* old_methods, methodOop* new_methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
329 int methods_length, bool * trace_name_printed);
a61af66fc99e Initial load
duke
parents:
diff changeset
330 };