annotate src/share/vm/ci/ciMethodData.hpp @ 6972:bd7a7ce2e264

6830717: replay of compilations would help with debugging Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method. Reviewed-by: kvn, twisti, sspitsyn Contributed-by: yumin.qi@oracle.com
author minqi
date Mon, 12 Nov 2012 14:03:53 -0800
parents da91efe96a93
children c775af091fe9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3371
diff changeset
2 * Copyright (c) 2001, 2012, Oracle and/or its affiliates. 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 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 196
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 196
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: 196
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
25 #ifndef SHARE_VM_CI_CIMETHODDATA_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
26 #define SHARE_VM_CI_CIMETHODDATA_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
28 #include "ci/ciClassList.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
29 #include "ci/ciKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
30 #include "ci/ciObject.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
31 #include "ci/ciUtilities.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3371
diff changeset
32 #include "oops/methodData.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
33 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
34
0
a61af66fc99e Initial load
duke
parents:
diff changeset
35 class ciBitData;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 class ciCounterData;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 class ciJumpData;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 class ciReceiverTypeData;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 class ciRetData;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 class ciBranchData;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 class ciArrayData;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 class ciMultiBranchData;
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
43 class ciArgInfoData;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
44
a61af66fc99e Initial load
duke
parents:
diff changeset
45 typedef ProfileData ciProfileData;
a61af66fc99e Initial load
duke
parents:
diff changeset
46
a61af66fc99e Initial load
duke
parents:
diff changeset
47 class ciBitData : public BitData {
a61af66fc99e Initial load
duke
parents:
diff changeset
48 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
49 ciBitData(DataLayout* layout) : BitData(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 ciCounterData : public CounterData {
a61af66fc99e Initial load
duke
parents:
diff changeset
53 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
54 ciCounterData(DataLayout* layout) : CounterData(layout) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
55 };
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 class ciJumpData : public JumpData {
a61af66fc99e Initial load
duke
parents:
diff changeset
58 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
59 ciJumpData(DataLayout* layout) : JumpData(layout) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
60 };
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 class ciReceiverTypeData : public ReceiverTypeData {
a61af66fc99e Initial load
duke
parents:
diff changeset
63 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
64 ciReceiverTypeData(DataLayout* layout) : ReceiverTypeData(layout) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 void set_receiver(uint row, ciKlass* recv) {
a61af66fc99e Initial load
duke
parents:
diff changeset
67 assert((uint)row < row_limit(), "oob");
a61af66fc99e Initial load
duke
parents:
diff changeset
68 set_intptr_at(receiver0_offset + row * receiver_type_row_cell_count,
a61af66fc99e Initial load
duke
parents:
diff changeset
69 (intptr_t) recv);
a61af66fc99e Initial load
duke
parents:
diff changeset
70 }
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 ciKlass* receiver(uint row) {
a61af66fc99e Initial load
duke
parents:
diff changeset
73 assert((uint)row < row_limit(), "oob");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3371
diff changeset
74 ciKlass* recv = (ciKlass*)intptr_at(receiver0_offset + row * receiver_type_row_cell_count);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
75 assert(recv == NULL || recv->is_klass(), "wrong type");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3371
diff changeset
76 return recv;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
77 }
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // Copy & translate from oop based ReceiverTypeData
a61af66fc99e Initial load
duke
parents:
diff changeset
80 virtual void translate_from(ProfileData* data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
81 translate_receiver_data_from(data);
a61af66fc99e Initial load
duke
parents:
diff changeset
82 }
a61af66fc99e Initial load
duke
parents:
diff changeset
83 void translate_receiver_data_from(ProfileData* data);
a61af66fc99e Initial load
duke
parents:
diff changeset
84 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
85 void print_data_on(outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
86 void print_receiver_data_on(outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
87 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
88 };
a61af66fc99e Initial load
duke
parents:
diff changeset
89
a61af66fc99e Initial load
duke
parents:
diff changeset
90 class ciVirtualCallData : public VirtualCallData {
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // Fake multiple inheritance... It's a ciReceiverTypeData also.
a61af66fc99e Initial load
duke
parents:
diff changeset
92 ciReceiverTypeData* rtd_super() { return (ciReceiverTypeData*) this; }
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
95 ciVirtualCallData(DataLayout* layout) : VirtualCallData(layout) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
96
a61af66fc99e Initial load
duke
parents:
diff changeset
97 void set_receiver(uint row, ciKlass* recv) {
a61af66fc99e Initial load
duke
parents:
diff changeset
98 rtd_super()->set_receiver(row, recv);
a61af66fc99e Initial load
duke
parents:
diff changeset
99 }
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 ciKlass* receiver(uint row) {
a61af66fc99e Initial load
duke
parents:
diff changeset
102 return rtd_super()->receiver(row);
a61af66fc99e Initial load
duke
parents:
diff changeset
103 }
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 // Copy & translate from oop based VirtualCallData
a61af66fc99e Initial load
duke
parents:
diff changeset
106 virtual void translate_from(ProfileData* data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
107 rtd_super()->translate_receiver_data_from(data);
a61af66fc99e Initial load
duke
parents:
diff changeset
108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
109 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
110 void print_data_on(outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
111 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
112 };
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 ciRetData : public RetData {
a61af66fc99e Initial load
duke
parents:
diff changeset
116 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
117 ciRetData(DataLayout* layout) : RetData(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 ciBranchData : public BranchData {
a61af66fc99e Initial load
duke
parents:
diff changeset
121 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
122 ciBranchData(DataLayout* layout) : BranchData(layout) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
123 };
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 class ciArrayData : public ArrayData {
a61af66fc99e Initial load
duke
parents:
diff changeset
126 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
127 ciArrayData(DataLayout* layout) : ArrayData(layout) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
128 };
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 class ciMultiBranchData : public MultiBranchData {
a61af66fc99e Initial load
duke
parents:
diff changeset
131 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
132 ciMultiBranchData(DataLayout* layout) : MultiBranchData(layout) {};
a61af66fc99e Initial load
duke
parents:
diff changeset
133 };
a61af66fc99e Initial load
duke
parents:
diff changeset
134
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
135 class ciArgInfoData : public ArgInfoData {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
136 public:
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
137 ciArgInfoData(DataLayout* layout) : ArgInfoData(layout) {};
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
138 };
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
139
0
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // ciMethodData
a61af66fc99e Initial load
duke
parents:
diff changeset
141 //
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3371
diff changeset
142 // This class represents a MethodData* in the HotSpot virtual
0
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // machine.
a61af66fc99e Initial load
duke
parents:
diff changeset
144
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3371
diff changeset
145 class ciMethodData : public ciMetadata {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
146 CI_PACKAGE_ACCESS
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6725
diff changeset
147 friend class ciReplay;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // Size in bytes
a61af66fc99e Initial load
duke
parents:
diff changeset
151 int _data_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
152 int _extra_data_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 // Data entries
a61af66fc99e Initial load
duke
parents:
diff changeset
155 intptr_t* _data;
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // Cached hint for data_before()
a61af66fc99e Initial load
duke
parents:
diff changeset
158 int _hint_di;
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // Is data attached? And is it mature?
a61af66fc99e Initial load
duke
parents:
diff changeset
161 enum { empty_state, immature_state, mature_state };
a61af66fc99e Initial load
duke
parents:
diff changeset
162 u_char _state;
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164 // Set this true if empty extra_data slots are ever witnessed.
a61af66fc99e Initial load
duke
parents:
diff changeset
165 u_char _saw_free_extra_data;
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // Support for interprocedural escape analysis
a61af66fc99e Initial load
duke
parents:
diff changeset
168 intx _eflags; // flags on escape information
a61af66fc99e Initial load
duke
parents:
diff changeset
169 intx _arg_local; // bit set of non-escaping arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
170 intx _arg_stack; // bit set of stack-allocatable arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
171 intx _arg_returned; // bit set of returned arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // Maturity of the oop when the snapshot is taken.
a61af66fc99e Initial load
duke
parents:
diff changeset
174 int _current_mileage;
a61af66fc99e Initial load
duke
parents:
diff changeset
175
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
176 // These counters hold the age of MDO in tiered. In tiered we can have the same method
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
177 // running at different compilation levels concurrently. So, in order to precisely measure
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
178 // its maturity we need separate counters.
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
179 int _invocation_counter;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
180 int _backedge_counter;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
181
0
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // Coherent snapshot of original header.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3371
diff changeset
183 MethodData _orig;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
184
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3371
diff changeset
185 ciMethodData(MethodData* md);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
186 ciMethodData();
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // Accessors
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
189 int data_size() const { return _data_size; }
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
190 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
191 intptr_t * data() const { return _data; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
192
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3371
diff changeset
193 MethodData* get_MethodData() const {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3371
diff changeset
194 return (MethodData*)_metadata;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
195 }
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 const char* type_string() { return "ciMethodData"; }
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 void print_impl(outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
200
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
201 DataLayout* data_layout_at(int data_index) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
202 assert(data_index % sizeof(intptr_t) == 0, "unaligned");
a61af66fc99e Initial load
duke
parents:
diff changeset
203 return (DataLayout*) (((address)_data) + data_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
204 }
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 bool out_of_bounds(int data_index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
207 return data_index >= data_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // hint accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
211 int hint_di() const { return _hint_di; }
a61af66fc99e Initial load
duke
parents:
diff changeset
212 void set_hint_di(int di) {
a61af66fc99e Initial load
duke
parents:
diff changeset
213 assert(!out_of_bounds(di), "hint_di out of bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
214 _hint_di = di;
a61af66fc99e Initial load
duke
parents:
diff changeset
215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
216 ciProfileData* data_before(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
217 // avoid SEGV on this edge case
a61af66fc99e Initial load
duke
parents:
diff changeset
218 if (data_size() == 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
219 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
220 int hint = hint_di();
a61af66fc99e Initial load
duke
parents:
diff changeset
221 if (data_layout_at(hint)->bci() <= bci)
a61af66fc99e Initial load
duke
parents:
diff changeset
222 return data_at(hint);
a61af66fc99e Initial load
duke
parents:
diff changeset
223 return first_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
224 }
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // What is the index of the first data entry?
a61af66fc99e Initial load
duke
parents:
diff changeset
228 int first_di() { return 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
229
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
230 ciArgInfoData *arg_info() const;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
231
0
a61af66fc99e Initial load
duke
parents:
diff changeset
232 public:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3371
diff changeset
233 bool is_method_data() const { return true; }
3371
fabcf26ee72f 6998541: JSR 292 implement missing return-type conversion for OP_RETYPE_RAW
twisti
parents: 1972
diff changeset
234
fabcf26ee72f 6998541: JSR 292 implement missing return-type conversion for OP_RETYPE_RAW
twisti
parents: 1972
diff changeset
235 void set_mature() { _state = mature_state; }
fabcf26ee72f 6998541: JSR 292 implement missing return-type conversion for OP_RETYPE_RAW
twisti
parents: 1972
diff changeset
236
fabcf26ee72f 6998541: JSR 292 implement missing return-type conversion for OP_RETYPE_RAW
twisti
parents: 1972
diff changeset
237 bool is_empty() { return _state == empty_state; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
238 bool is_mature() { return _state == mature_state; }
a61af66fc99e Initial load
duke
parents:
diff changeset
239
a61af66fc99e Initial load
duke
parents:
diff changeset
240 int creation_mileage() { return _orig.creation_mileage(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
241 int current_mileage() { return _current_mileage; }
a61af66fc99e Initial load
duke
parents:
diff changeset
242
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
243 int invocation_count() { return _invocation_counter; }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
244 int backedge_count() { return _backedge_counter; }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3371
diff changeset
245 // Transfer information about the method to MethodData*.
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
246 // would_profile means we would like to profile this method,
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
247 // meaning it's not trivial.
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
248 void set_would_profile(bool p);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
249 // Also set the numer of loops and blocks in the method.
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
250 // Again, this is used to determine if a method is trivial.
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
251 void set_compilation_stats(short loops, short blocks);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
252
0
a61af66fc99e Initial load
duke
parents:
diff changeset
253 void load_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
254
a61af66fc99e Initial load
duke
parents:
diff changeset
255 // Convert a dp (data pointer) to a di (data index).
a61af66fc99e Initial load
duke
parents:
diff changeset
256 int dp_to_di(address dp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
257 return dp - ((address)_data);
a61af66fc99e Initial load
duke
parents:
diff changeset
258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
259
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // Get the data at an arbitrary (sort of) data index.
a61af66fc99e Initial load
duke
parents:
diff changeset
261 ciProfileData* data_at(int data_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
262
a61af66fc99e Initial load
duke
parents:
diff changeset
263 // Walk through the data in order.
a61af66fc99e Initial load
duke
parents:
diff changeset
264 ciProfileData* first_data() { return data_at(first_di()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
265 ciProfileData* next_data(ciProfileData* current);
a61af66fc99e Initial load
duke
parents:
diff changeset
266 bool is_valid(ciProfileData* current) { return current != NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
267
a61af66fc99e Initial load
duke
parents:
diff changeset
268 // Get the data at an arbitrary bci, or NULL if there is none.
a61af66fc99e Initial load
duke
parents:
diff changeset
269 ciProfileData* bci_to_data(int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
270 ciProfileData* bci_to_extra_data(int bci, bool create_if_missing);
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272 uint overflow_trap_count() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
273 return _orig.overflow_trap_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
274 }
a61af66fc99e Initial load
duke
parents:
diff changeset
275 uint overflow_recompile_count() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
276 return _orig.overflow_recompile_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
277 }
a61af66fc99e Initial load
duke
parents:
diff changeset
278 uint decompile_count() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
279 return _orig.decompile_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
280 }
a61af66fc99e Initial load
duke
parents:
diff changeset
281 uint trap_count(int reason) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
282 return _orig.trap_count(reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
284 uint trap_reason_limit() const { return _orig.trap_reason_limit(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
285 uint trap_count_limit() const { return _orig.trap_count_limit(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
286
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // Helpful query functions that decode trap_state.
a61af66fc99e Initial load
duke
parents:
diff changeset
288 int has_trap_at(ciProfileData* data, int reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
289 int has_trap_at(int bci, int reason) {
a61af66fc99e Initial load
duke
parents:
diff changeset
290 return has_trap_at(bci_to_data(bci), reason);
a61af66fc99e Initial load
duke
parents:
diff changeset
291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
292 int trap_recompiled_at(ciProfileData* data);
a61af66fc99e Initial load
duke
parents:
diff changeset
293 int trap_recompiled_at(int bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
294 return trap_recompiled_at(bci_to_data(bci));
a61af66fc99e Initial load
duke
parents:
diff changeset
295 }
a61af66fc99e Initial load
duke
parents:
diff changeset
296
a61af66fc99e Initial load
duke
parents:
diff changeset
297 void clear_escape_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
298 bool has_escape_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
299 void update_escape_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
300
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3371
diff changeset
301 void set_eflag(MethodData::EscapeFlag f);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3371
diff changeset
302 void clear_eflag(MethodData::EscapeFlag f);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3371
diff changeset
303 bool eflag_set(MethodData::EscapeFlag f) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
304
a61af66fc99e Initial load
duke
parents:
diff changeset
305 void set_arg_local(int i);
a61af66fc99e Initial load
duke
parents:
diff changeset
306 void set_arg_stack(int i);
a61af66fc99e Initial load
duke
parents:
diff changeset
307 void set_arg_returned(int i);
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
308 void set_arg_modified(int arg, uint val);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
309
a61af66fc99e Initial load
duke
parents:
diff changeset
310 bool is_arg_local(int i) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
311 bool is_arg_stack(int i) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
312 bool is_arg_returned(int i) const;
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
313 uint arg_modified(int arg) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
314
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // Code generation helper
a61af66fc99e Initial load
duke
parents:
diff changeset
316 ByteSize offset_of_slot(ciProfileData* data, ByteSize slot_offset_in_data);
a61af66fc99e Initial load
duke
parents:
diff changeset
317 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
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // printing support for method data
a61af66fc99e Initial load
duke
parents:
diff changeset
321 void print();
a61af66fc99e Initial load
duke
parents:
diff changeset
322 void print_data_on(outputStream* st);
a61af66fc99e Initial load
duke
parents:
diff changeset
323 #endif
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6725
diff changeset
324 void dump_replay_data(outputStream* out);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
325 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
326
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
327 #endif // SHARE_VM_CI_CIMETHODDATA_HPP