annotate src/share/vm/ci/ciMethodData.hpp @ 1145:e018e6884bd8

6631166: CMS: better heuristics when combatting fragmentation Summary: Autonomic per-worker free block cache sizing, tunable coalition policies, fixes to per-size block statistics, retuned gain and bandwidth of some feedback loop filters to allow quicker reactivity to abrupt changes in ambient demand, and other heuristics to reduce fragmentation of the CMS old gen. Also tightened some assertions, including those related to locking. Reviewed-by: jmasa
author ysr
date Wed, 23 Dec 2009 09:23:54 -0800
parents d1605aabd0a1
children c18cbe5936b8
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: 45
diff changeset
2 * Copyright 2001-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 class ciBitData;
a61af66fc99e Initial load
duke
parents:
diff changeset
26 class ciCounterData;
a61af66fc99e Initial load
duke
parents:
diff changeset
27 class ciJumpData;
a61af66fc99e Initial load
duke
parents:
diff changeset
28 class ciReceiverTypeData;
a61af66fc99e Initial load
duke
parents:
diff changeset
29 class ciRetData;
a61af66fc99e Initial load
duke
parents:
diff changeset
30 class ciBranchData;
a61af66fc99e Initial load
duke
parents:
diff changeset
31 class ciArrayData;
a61af66fc99e Initial load
duke
parents:
diff changeset
32 class ciMultiBranchData;
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
33 class ciArgInfoData;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
34
a61af66fc99e Initial load
duke
parents:
diff changeset
35 typedef ProfileData ciProfileData;
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 class ciBitData : public BitData {
a61af66fc99e Initial load
duke
parents:
diff changeset
38 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
39 ciBitData(DataLayout* layout) : BitData(layout) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
40 };
a61af66fc99e Initial load
duke
parents:
diff changeset
41
a61af66fc99e Initial load
duke
parents:
diff changeset
42 class ciCounterData : public CounterData {
a61af66fc99e Initial load
duke
parents:
diff changeset
43 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
44 ciCounterData(DataLayout* layout) : CounterData(layout) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
45 };
a61af66fc99e Initial load
duke
parents:
diff changeset
46
a61af66fc99e Initial load
duke
parents:
diff changeset
47 class ciJumpData : public JumpData {
a61af66fc99e Initial load
duke
parents:
diff changeset
48 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
49 ciJumpData(DataLayout* layout) : JumpData(layout) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
50 };
a61af66fc99e Initial load
duke
parents:
diff changeset
51
a61af66fc99e Initial load
duke
parents:
diff changeset
52 class ciReceiverTypeData : public ReceiverTypeData {
a61af66fc99e Initial load
duke
parents:
diff changeset
53 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
54 ciReceiverTypeData(DataLayout* layout) : ReceiverTypeData(layout) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 void set_receiver(uint row, ciKlass* recv) {
a61af66fc99e Initial load
duke
parents:
diff changeset
57 assert((uint)row < row_limit(), "oob");
a61af66fc99e Initial load
duke
parents:
diff changeset
58 set_intptr_at(receiver0_offset + row * receiver_type_row_cell_count,
a61af66fc99e Initial load
duke
parents:
diff changeset
59 (intptr_t) recv);
a61af66fc99e Initial load
duke
parents:
diff changeset
60 }
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 ciKlass* receiver(uint row) {
a61af66fc99e Initial load
duke
parents:
diff changeset
63 assert((uint)row < row_limit(), "oob");
a61af66fc99e Initial load
duke
parents:
diff changeset
64 ciObject* recv = (ciObject*)intptr_at(receiver0_offset + row * receiver_type_row_cell_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
65 assert(recv == NULL || recv->is_klass(), "wrong type");
a61af66fc99e Initial load
duke
parents:
diff changeset
66 return (ciKlass*)recv;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 }
a61af66fc99e Initial load
duke
parents:
diff changeset
68
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // Copy & translate from oop based ReceiverTypeData
a61af66fc99e Initial load
duke
parents:
diff changeset
70 virtual void translate_from(ProfileData* data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
71 translate_receiver_data_from(data);
a61af66fc99e Initial load
duke
parents:
diff changeset
72 }
a61af66fc99e Initial load
duke
parents:
diff changeset
73 void translate_receiver_data_from(ProfileData* data);
a61af66fc99e Initial load
duke
parents:
diff changeset
74 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
75 void print_data_on(outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
76 void print_receiver_data_on(outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
77 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
78 };
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 class ciVirtualCallData : public VirtualCallData {
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // Fake multiple inheritance... It's a ciReceiverTypeData also.
a61af66fc99e Initial load
duke
parents:
diff changeset
82 ciReceiverTypeData* rtd_super() { return (ciReceiverTypeData*) this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
85 ciVirtualCallData(DataLayout* layout) : VirtualCallData(layout) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 void set_receiver(uint row, ciKlass* recv) {
a61af66fc99e Initial load
duke
parents:
diff changeset
88 rtd_super()->set_receiver(row, recv);
a61af66fc99e Initial load
duke
parents:
diff changeset
89 }
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 ciKlass* receiver(uint row) {
a61af66fc99e Initial load
duke
parents:
diff changeset
92 return rtd_super()->receiver(row);
a61af66fc99e Initial load
duke
parents:
diff changeset
93 }
a61af66fc99e Initial load
duke
parents:
diff changeset
94
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // Copy & translate from oop based VirtualCallData
a61af66fc99e Initial load
duke
parents:
diff changeset
96 virtual void translate_from(ProfileData* data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
97 rtd_super()->translate_receiver_data_from(data);
a61af66fc99e Initial load
duke
parents:
diff changeset
98 }
a61af66fc99e Initial load
duke
parents:
diff changeset
99 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
100 void print_data_on(outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
101 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
102 };
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 class ciRetData : public RetData {
a61af66fc99e Initial load
duke
parents:
diff changeset
106 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
107 ciRetData(DataLayout* layout) : RetData(layout) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
108 };
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 class ciBranchData : public BranchData {
a61af66fc99e Initial load
duke
parents:
diff changeset
111 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
112 ciBranchData(DataLayout* layout) : BranchData(layout) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
113 };
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 class ciArrayData : public ArrayData {
a61af66fc99e Initial load
duke
parents:
diff changeset
116 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
117 ciArrayData(DataLayout* layout) : ArrayData(layout) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
118 };
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 class ciMultiBranchData : public MultiBranchData {
a61af66fc99e Initial load
duke
parents:
diff changeset
121 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
122 ciMultiBranchData(DataLayout* layout) : MultiBranchData(layout) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
123 };
a61af66fc99e Initial load
duke
parents:
diff changeset
124
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
125 class ciArgInfoData : public ArgInfoData {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
126 public:
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
127 ciArgInfoData(DataLayout* layout) : ArgInfoData(layout) {};
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
128 };
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
129
0
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // ciMethodData
a61af66fc99e Initial load
duke
parents:
diff changeset
131 //
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // This class represents a methodDataOop in the HotSpot virtual
a61af66fc99e Initial load
duke
parents:
diff changeset
133 // machine.
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135 class ciMethodData : public ciObject {
a61af66fc99e Initial load
duke
parents:
diff changeset
136 CI_PACKAGE_ACCESS
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // Size in bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
140 int _data_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
141 int _extra_data_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
142
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // Data entries
a61af66fc99e Initial load
duke
parents:
diff changeset
144 intptr_t* _data;
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // Cached hint for data_before()
a61af66fc99e Initial load
duke
parents:
diff changeset
147 int _hint_di;
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // Is data attached? And is it mature?
a61af66fc99e Initial load
duke
parents:
diff changeset
150 enum { empty_state, immature_state, mature_state };
a61af66fc99e Initial load
duke
parents:
diff changeset
151 u_char _state;
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // Set this true if empty extra_data slots are ever witnessed.
a61af66fc99e Initial load
duke
parents:
diff changeset
154 u_char _saw_free_extra_data;
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 // Support for interprocedural escape analysis
a61af66fc99e Initial load
duke
parents:
diff changeset
157 intx _eflags; // flags on escape information
a61af66fc99e Initial load
duke
parents:
diff changeset
158 intx _arg_local; // bit set of non-escaping arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
159 intx _arg_stack; // bit set of stack-allocatable arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
160 intx _arg_returned; // bit set of returned arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // Maturity of the oop when the snapshot is taken.
a61af66fc99e Initial load
duke
parents:
diff changeset
163 int _current_mileage;
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // Coherent snapshot of original header.
a61af66fc99e Initial load
duke
parents:
diff changeset
166 methodDataOopDesc _orig;
a61af66fc99e Initial load
duke
parents:
diff changeset
167
a61af66fc99e Initial load
duke
parents:
diff changeset
168 ciMethodData(methodDataHandle h_md);
a61af66fc99e Initial load
duke
parents:
diff changeset
169 ciMethodData();
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // Accessors
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
172 int data_size() const { return _data_size; }
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
173 int extra_data_size() const { return _extra_data_size; }
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
174 intptr_t * data() const { return _data; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176 methodDataOop get_methodDataOop() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
177 if (handle() == NULL) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
178 methodDataOop mdo = (methodDataOop)get_oop();
a61af66fc99e Initial load
duke
parents:
diff changeset
179 assert(mdo != NULL, "illegal use of unloaded method data");
a61af66fc99e Initial load
duke
parents:
diff changeset
180 return mdo;
a61af66fc99e Initial load
duke
parents:
diff changeset
181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183 const char* type_string() { return "ciMethodData"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
184
a61af66fc99e Initial load
duke
parents:
diff changeset
185 void print_impl(outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
186
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
187 DataLayout* data_layout_at(int data_index) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
188 assert(data_index % sizeof(intptr_t) == 0, "unaligned");
a61af66fc99e Initial load
duke
parents:
diff changeset
189 return (DataLayout*) (((address)_data) + data_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
190 }
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 bool out_of_bounds(int data_index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
193 return data_index >= data_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
194 }
a61af66fc99e Initial load
duke
parents:
diff changeset
195
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // hint accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
197 int hint_di() const { return _hint_di; }
a61af66fc99e Initial load
duke
parents:
diff changeset
198 void set_hint_di(int di) {
a61af66fc99e Initial load
duke
parents:
diff changeset
199 assert(!out_of_bounds(di), "hint_di out of bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
200 _hint_di = di;
a61af66fc99e Initial load
duke
parents:
diff changeset
201 }
a61af66fc99e Initial load
duke
parents:
diff changeset
202 ciProfileData* data_before(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
203 // avoid SEGV on this edge case
a61af66fc99e Initial load
duke
parents:
diff changeset
204 if (data_size() == 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
205 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
206 int hint = hint_di();
a61af66fc99e Initial load
duke
parents:
diff changeset
207 if (data_layout_at(hint)->bci() <= bci)
a61af66fc99e Initial load
duke
parents:
diff changeset
208 return data_at(hint);
a61af66fc99e Initial load
duke
parents:
diff changeset
209 return first_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
211
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // What is the index of the first data entry?
a61af66fc99e Initial load
duke
parents:
diff changeset
214 int first_di() { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
215
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
216 ciArgInfoData *arg_info() const;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
217
0
a61af66fc99e Initial load
duke
parents:
diff changeset
218 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
219 bool is_method_data() { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
220 bool is_empty() { return _state == empty_state; }
a61af66fc99e Initial load
duke
parents:
diff changeset
221 bool is_mature() { return _state == mature_state; }
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223 int creation_mileage() { return _orig.creation_mileage(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
224 int current_mileage() { return _current_mileage; }
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226 void load_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // Convert a dp (data pointer) to a di (data index).
a61af66fc99e Initial load
duke
parents:
diff changeset
229 int dp_to_di(address dp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
230 return dp - ((address)_data);
a61af66fc99e Initial load
duke
parents:
diff changeset
231 }
a61af66fc99e Initial load
duke
parents:
diff changeset
232
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // Get the data at an arbitrary (sort of) data index.
a61af66fc99e Initial load
duke
parents:
diff changeset
234 ciProfileData* data_at(int data_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // Walk through the data in order.
a61af66fc99e Initial load
duke
parents:
diff changeset
237 ciProfileData* first_data() { return data_at(first_di()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
238 ciProfileData* next_data(ciProfileData* current);
a61af66fc99e Initial load
duke
parents:
diff changeset
239 bool is_valid(ciProfileData* current) { return current != NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // Get the data at an arbitrary bci, or NULL if there is none.
a61af66fc99e Initial load
duke
parents:
diff changeset
242 ciProfileData* bci_to_data(int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
243 ciProfileData* bci_to_extra_data(int bci, bool create_if_missing);
a61af66fc99e Initial load
duke
parents:
diff changeset
244
a61af66fc99e Initial load
duke
parents:
diff changeset
245 uint overflow_trap_count() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
246 return _orig.overflow_trap_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
247 }
a61af66fc99e Initial load
duke
parents:
diff changeset
248 uint overflow_recompile_count() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
249 return _orig.overflow_recompile_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
250 }
a61af66fc99e Initial load
duke
parents:
diff changeset
251 uint decompile_count() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
252 return _orig.decompile_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
253 }
a61af66fc99e Initial load
duke
parents:
diff changeset
254 uint trap_count(int reason) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
255 return _orig.trap_count(reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
256 }
a61af66fc99e Initial load
duke
parents:
diff changeset
257 uint trap_reason_limit() const { return _orig.trap_reason_limit(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
258 uint trap_count_limit() const { return _orig.trap_count_limit(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
259
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // Helpful query functions that decode trap_state.
a61af66fc99e Initial load
duke
parents:
diff changeset
261 int has_trap_at(ciProfileData* data, int reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
262 int has_trap_at(int bci, int reason) {
a61af66fc99e Initial load
duke
parents:
diff changeset
263 return has_trap_at(bci_to_data(bci), reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
265 int trap_recompiled_at(ciProfileData* data);
a61af66fc99e Initial load
duke
parents:
diff changeset
266 int trap_recompiled_at(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
267 return trap_recompiled_at(bci_to_data(bci));
a61af66fc99e Initial load
duke
parents:
diff changeset
268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
269
a61af66fc99e Initial load
duke
parents:
diff changeset
270 void clear_escape_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
271 bool has_escape_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
272 void update_escape_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274 void set_eflag(methodDataOopDesc::EscapeFlag f);
a61af66fc99e Initial load
duke
parents:
diff changeset
275 void clear_eflag(methodDataOopDesc::EscapeFlag f);
a61af66fc99e Initial load
duke
parents:
diff changeset
276 bool eflag_set(methodDataOopDesc::EscapeFlag f) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
277
a61af66fc99e Initial load
duke
parents:
diff changeset
278 void set_arg_local(int i);
a61af66fc99e Initial load
duke
parents:
diff changeset
279 void set_arg_stack(int i);
a61af66fc99e Initial load
duke
parents:
diff changeset
280 void set_arg_returned(int i);
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
281 void set_arg_modified(int arg, uint val);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
282
a61af66fc99e Initial load
duke
parents:
diff changeset
283 bool is_arg_local(int i) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
284 bool is_arg_stack(int i) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
285 bool is_arg_returned(int i) const;
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
286 uint arg_modified(int arg) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // Code generation helper
a61af66fc99e Initial load
duke
parents:
diff changeset
289 ByteSize offset_of_slot(ciProfileData* data, ByteSize slot_offset_in_data);
a61af66fc99e Initial load
duke
parents:
diff changeset
290 int byte_offset_of_slot(ciProfileData* data, ByteSize slot_offset_in_data) { return in_bytes(offset_of_slot(data, slot_offset_in_data)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
291
a61af66fc99e Initial load
duke
parents:
diff changeset
292 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
293 // printing support for method data
a61af66fc99e Initial load
duke
parents:
diff changeset
294 void print();
a61af66fc99e Initial load
duke
parents:
diff changeset
295 void print_data_on(outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
296 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
297 };