Mercurial > hg > truffle
annotate src/share/vm/ci/ciMethodData.cpp @ 17716:cdb71841f4bc
6498581: ThreadInterruptTest3 produces wrong output on Windows
Summary: There is race condition between os::interrupt and os::is_interrupted on Windows. In JVM_Sleep(Thread.sleep), check if thread gets interrupted, it may see interrupted but not really interrupted so cause spurious waking up (early return from sleep). Fix by checking if interrupt event really gets set thus prevent false return. For intrinsic of _isInterrupted, on Windows, go fastpath only on bit not set.
Reviewed-by: acorn, kvn
Contributed-by: david.holmes@oracle.com, yumin.qi@oracle.com
author | minqi |
---|---|
date | Wed, 26 Feb 2014 15:20:41 -0800 |
parents | 55fb97c4c58d |
children | fdad2932c73f |
rev | line source |
---|---|
0 | 1 /* |
17467
55fb97c4c58d
8029233: Update copyright year to match last edit in jdk8 hotspot repository for 2013
mikael
parents:
12962
diff
changeset
|
2 * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
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 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
26 #include "ci/ciMetadata.hpp" |
1972 | 27 #include "ci/ciMethodData.hpp" |
6972
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
28 #include "ci/ciReplay.hpp" |
1972 | 29 #include "ci/ciUtilities.hpp" |
30 #include "memory/allocation.inline.hpp" | |
31 #include "memory/resourceArea.hpp" | |
32 #include "runtime/deoptimization.hpp" | |
33 #include "utilities/copy.hpp" | |
0 | 34 |
35 // ciMethodData | |
36 | |
37 // ------------------------------------------------------------------ | |
38 // ciMethodData::ciMethodData | |
39 // | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
40 ciMethodData::ciMethodData(MethodData* md) : ciMetadata(md) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
41 assert(md != NULL, "no null method data"); |
0 | 42 Copy::zero_to_words((HeapWord*) &_orig, sizeof(_orig) / sizeof(HeapWord)); |
43 _data = NULL; | |
44 _data_size = 0; | |
45 _extra_data_size = 0; | |
46 _current_mileage = 0; | |
1783 | 47 _invocation_counter = 0; |
48 _backedge_counter = 0; | |
0 | 49 _state = empty_state; |
50 _saw_free_extra_data = false; | |
51 // Set an initial hint. Don't use set_hint_di() because | |
52 // first_di() may be out of bounds if data_size is 0. | |
53 _hint_di = first_di(); | |
45
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
54 // Initialize the escape information (to "don't know."); |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
55 _eflags = _arg_local = _arg_stack = _arg_returned = 0; |
12962
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
12882
diff
changeset
|
56 _parameters = NULL; |
0 | 57 } |
58 | |
59 // ------------------------------------------------------------------ | |
60 // ciMethodData::ciMethodData | |
61 // | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
62 // No MethodData*. |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
63 ciMethodData::ciMethodData() : ciMetadata(NULL) { |
0 | 64 Copy::zero_to_words((HeapWord*) &_orig, sizeof(_orig) / sizeof(HeapWord)); |
65 _data = NULL; | |
66 _data_size = 0; | |
67 _extra_data_size = 0; | |
68 _current_mileage = 0; | |
1783 | 69 _invocation_counter = 0; |
70 _backedge_counter = 0; | |
0 | 71 _state = empty_state; |
72 _saw_free_extra_data = false; | |
73 // Set an initial hint. Don't use set_hint_di() because | |
74 // first_di() may be out of bounds if data_size is 0. | |
75 _hint_di = first_di(); | |
45
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
76 // Initialize the escape information (to "don't know."); |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
77 _eflags = _arg_local = _arg_stack = _arg_returned = 0; |
12962
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
12882
diff
changeset
|
78 _parameters = NULL; |
0 | 79 } |
80 | |
81 void ciMethodData::load_data() { | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
82 MethodData* mdo = get_MethodData(); |
12868
c775af091fe9
8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
twisti
parents:
12865
diff
changeset
|
83 if (mdo == NULL) { |
c775af091fe9
8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
twisti
parents:
12865
diff
changeset
|
84 return; |
c775af091fe9
8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
twisti
parents:
12865
diff
changeset
|
85 } |
0 | 86 |
87 // To do: don't copy the data if it is not "ripe" -- require a minimum # | |
88 // of invocations. | |
89 | |
90 // Snapshot the data -- actually, take an approximate snapshot of | |
91 // the data. Any concurrently executing threads may be changing the | |
92 // data as we copy it. | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
93 Copy::disjoint_words((HeapWord*) mdo, |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
94 (HeapWord*) &_orig, |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
95 sizeof(_orig) / HeapWordSize); |
0 | 96 Arena* arena = CURRENT_ENV->arena(); |
97 _data_size = mdo->data_size(); | |
98 _extra_data_size = mdo->extra_data_size(); | |
99 int total_size = _data_size + _extra_data_size; | |
100 _data = (intptr_t *) arena->Amalloc(total_size); | |
101 Copy::disjoint_words((HeapWord*) mdo->data_base(), (HeapWord*) _data, total_size / HeapWordSize); | |
102 | |
103 // Traverse the profile data, translating any oops into their | |
104 // ci equivalents. | |
105 ResourceMark rm; | |
106 ciProfileData* ci_data = first_data(); | |
107 ProfileData* data = mdo->first_data(); | |
108 while (is_valid(ci_data)) { | |
109 ci_data->translate_from(data); | |
110 ci_data = next_data(ci_data); | |
111 data = mdo->next_data(data); | |
112 } | |
12962
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
12882
diff
changeset
|
113 if (mdo->parameters_type_data() != NULL) { |
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
12882
diff
changeset
|
114 _parameters = data_layout_at(mdo->parameters_type_data_di()); |
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
12882
diff
changeset
|
115 ciParametersTypeData* parameters = new ciParametersTypeData(_parameters); |
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
12882
diff
changeset
|
116 parameters->translate_from(mdo->parameters_type_data()); |
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
12882
diff
changeset
|
117 } |
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
12882
diff
changeset
|
118 |
0 | 119 // Note: Extra data are all BitData, and do not need translation. |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
120 _current_mileage = MethodData::mileage_of(mdo->method()); |
1783 | 121 _invocation_counter = mdo->invocation_count(); |
122 _backedge_counter = mdo->backedge_count(); | |
0 | 123 _state = mdo->is_mature()? mature_state: immature_state; |
124 | |
125 _eflags = mdo->eflags(); | |
126 _arg_local = mdo->arg_local(); | |
127 _arg_stack = mdo->arg_stack(); | |
128 _arg_returned = mdo->arg_returned(); | |
6972
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
129 #ifndef PRODUCT |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
130 if (ReplayCompiles) { |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
131 ciReplay::initialize(this); |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
132 } |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
133 #endif |
0 | 134 } |
135 | |
12875
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
136 void ciReceiverTypeData::translate_receiver_data_from(const ProfileData* data) { |
0 | 137 for (uint row = 0; row < row_limit(); row++) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
138 Klass* k = data->as_ReceiverTypeData()->receiver(row); |
0 | 139 if (k != NULL) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
140 ciKlass* klass = CURRENT_ENV->get_klass(k); |
0 | 141 set_receiver(row, klass); |
142 } | |
143 } | |
144 } | |
145 | |
146 | |
12875
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
147 void ciTypeStackSlotEntries::translate_type_data_from(const TypeStackSlotEntries* entries) { |
12882
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
148 for (int i = 0; i < _number_of_entries; i++) { |
12875
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
149 intptr_t k = entries->type(i); |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
150 TypeStackSlotEntries::set_type(i, translate_klass(k)); |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
151 } |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
152 } |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
153 |
12882
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
154 void ciReturnTypeEntry::translate_type_data_from(const ReturnTypeEntry* ret) { |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
155 intptr_t k = ret->type(); |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
156 set_type(translate_klass(k)); |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
157 } |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
158 |
0 | 159 // Get the data at an arbitrary (sort of) data index. |
160 ciProfileData* ciMethodData::data_at(int data_index) { | |
161 if (out_of_bounds(data_index)) { | |
162 return NULL; | |
163 } | |
164 DataLayout* data_layout = data_layout_at(data_index); | |
165 | |
166 switch (data_layout->tag()) { | |
167 case DataLayout::no_tag: | |
168 default: | |
169 ShouldNotReachHere(); | |
170 return NULL; | |
171 case DataLayout::bit_data_tag: | |
172 return new ciBitData(data_layout); | |
173 case DataLayout::counter_data_tag: | |
174 return new ciCounterData(data_layout); | |
175 case DataLayout::jump_data_tag: | |
176 return new ciJumpData(data_layout); | |
177 case DataLayout::receiver_type_data_tag: | |
178 return new ciReceiverTypeData(data_layout); | |
179 case DataLayout::virtual_call_data_tag: | |
180 return new ciVirtualCallData(data_layout); | |
181 case DataLayout::ret_data_tag: | |
182 return new ciRetData(data_layout); | |
183 case DataLayout::branch_data_tag: | |
184 return new ciBranchData(data_layout); | |
185 case DataLayout::multi_branch_data_tag: | |
186 return new ciMultiBranchData(data_layout); | |
45
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
187 case DataLayout::arg_info_data_tag: |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
188 return new ciArgInfoData(data_layout); |
12875
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
189 case DataLayout::call_type_data_tag: |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
190 return new ciCallTypeData(data_layout); |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
191 case DataLayout::virtual_call_type_data_tag: |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
192 return new ciVirtualCallTypeData(data_layout); |
12962
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
12882
diff
changeset
|
193 case DataLayout::parameters_type_data_tag: |
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
12882
diff
changeset
|
194 return new ciParametersTypeData(data_layout); |
0 | 195 }; |
196 } | |
197 | |
198 // Iteration over data. | |
199 ciProfileData* ciMethodData::next_data(ciProfileData* current) { | |
200 int current_index = dp_to_di(current->dp()); | |
201 int next_index = current_index + current->size_in_bytes(); | |
202 ciProfileData* next = data_at(next_index); | |
203 return next; | |
204 } | |
205 | |
206 // Translate a bci to its corresponding data, or NULL. | |
207 ciProfileData* ciMethodData::bci_to_data(int bci) { | |
208 ciProfileData* data = data_before(bci); | |
209 for ( ; is_valid(data); data = next_data(data)) { | |
210 if (data->bci() == bci) { | |
211 set_hint_di(dp_to_di(data->dp())); | |
212 return data; | |
213 } else if (data->bci() > bci) { | |
214 break; | |
215 } | |
216 } | |
217 // bci_to_extra_data(bci) ... | |
218 DataLayout* dp = data_layout_at(data_size()); | |
219 DataLayout* end = data_layout_at(data_size() + extra_data_size()); | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
220 for (; dp < end; dp = MethodData::next_extra(dp)) { |
0 | 221 if (dp->tag() == DataLayout::no_tag) { |
222 _saw_free_extra_data = true; // observed an empty slot (common case) | |
223 return NULL; | |
224 } | |
45
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
225 if (dp->tag() == DataLayout::arg_info_data_tag) { |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
226 break; // ArgInfoData is at the end of extra data section. |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
227 } |
0 | 228 if (dp->bci() == bci) { |
229 assert(dp->tag() == DataLayout::bit_data_tag, "sane"); | |
230 return new ciBitData(dp); | |
231 } | |
232 } | |
233 return NULL; | |
234 } | |
235 | |
236 // Conservatively decode the trap_state of a ciProfileData. | |
237 int ciMethodData::has_trap_at(ciProfileData* data, int reason) { | |
238 typedef Deoptimization::DeoptReason DR_t; | |
239 int per_bc_reason | |
240 = Deoptimization::reason_recorded_per_bytecode_if_any((DR_t) reason); | |
241 if (trap_count(reason) == 0) { | |
242 // Impossible for this trap to have occurred, regardless of trap_state. | |
243 // Note: This happens if the MDO is empty. | |
244 return 0; | |
245 } else if (per_bc_reason == Deoptimization::Reason_none) { | |
246 // We cannot conclude anything; a trap happened somewhere, maybe here. | |
247 return -1; | |
248 } else if (data == NULL) { | |
249 // No profile here, not even an extra_data record allocated on the fly. | |
250 // If there are empty extra_data records, and there had been a trap, | |
251 // there would have been a non-null data pointer. If there are no | |
252 // free extra_data records, we must return a conservative -1. | |
253 if (_saw_free_extra_data) | |
254 return 0; // Q.E.D. | |
255 else | |
256 return -1; // bail with a conservative answer | |
257 } else { | |
258 return Deoptimization::trap_state_has_reason(data->trap_state(), per_bc_reason); | |
259 } | |
260 } | |
261 | |
262 int ciMethodData::trap_recompiled_at(ciProfileData* data) { | |
263 if (data == NULL) { | |
264 return (_saw_free_extra_data? 0: -1); // (see previous method) | |
265 } else { | |
266 return Deoptimization::trap_state_is_recompiled(data->trap_state())? 1: 0; | |
267 } | |
268 } | |
269 | |
270 void ciMethodData::clear_escape_info() { | |
271 VM_ENTRY_MARK; | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
272 MethodData* mdo = get_MethodData(); |
45
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
273 if (mdo != NULL) { |
0 | 274 mdo->clear_escape_info(); |
45
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
275 ArgInfoData *aid = arg_info(); |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
276 int arg_count = (aid == NULL) ? 0 : aid->number_of_args(); |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
277 for (int i = 0; i < arg_count; i++) { |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
278 set_arg_modified(i, 0); |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
279 } |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
280 } |
0 | 281 _eflags = _arg_local = _arg_stack = _arg_returned = 0; |
282 } | |
283 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
284 // copy our escape info to the MethodData* if it exists |
0 | 285 void ciMethodData::update_escape_info() { |
286 VM_ENTRY_MARK; | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
287 MethodData* mdo = get_MethodData(); |
0 | 288 if ( mdo != NULL) { |
289 mdo->set_eflags(_eflags); | |
290 mdo->set_arg_local(_arg_local); | |
291 mdo->set_arg_stack(_arg_stack); | |
292 mdo->set_arg_returned(_arg_returned); | |
45
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
293 int arg_count = mdo->method()->size_of_parameters(); |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
294 for (int i = 0; i < arg_count; i++) { |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
295 mdo->set_arg_modified(i, arg_modified(i)); |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
296 } |
0 | 297 } |
298 } | |
299 | |
1783 | 300 void ciMethodData::set_compilation_stats(short loops, short blocks) { |
301 VM_ENTRY_MARK; | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
302 MethodData* mdo = get_MethodData(); |
1783 | 303 if (mdo != NULL) { |
304 mdo->set_num_loops(loops); | |
305 mdo->set_num_blocks(blocks); | |
306 } | |
307 } | |
308 | |
309 void ciMethodData::set_would_profile(bool p) { | |
310 VM_ENTRY_MARK; | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
311 MethodData* mdo = get_MethodData(); |
1783 | 312 if (mdo != NULL) { |
313 mdo->set_would_profile(p); | |
314 } | |
315 } | |
316 | |
12875
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
317 void ciMethodData::set_argument_type(int bci, int i, ciKlass* k) { |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
318 VM_ENTRY_MARK; |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
319 MethodData* mdo = get_MethodData(); |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
320 if (mdo != NULL) { |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
321 ProfileData* data = mdo->bci_to_data(bci); |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
322 if (data->is_CallTypeData()) { |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
323 data->as_CallTypeData()->set_argument_type(i, k->get_Klass()); |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
324 } else { |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
325 assert(data->is_VirtualCallTypeData(), "no arguments!"); |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
326 data->as_VirtualCallTypeData()->set_argument_type(i, k->get_Klass()); |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
327 } |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
328 } |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
329 } |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
330 |
12962
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
12882
diff
changeset
|
331 void ciMethodData::set_parameter_type(int i, ciKlass* k) { |
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
12882
diff
changeset
|
332 VM_ENTRY_MARK; |
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
12882
diff
changeset
|
333 MethodData* mdo = get_MethodData(); |
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
12882
diff
changeset
|
334 if (mdo != NULL) { |
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
12882
diff
changeset
|
335 mdo->parameters_type_data()->set_type(i, k->get_Klass()); |
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
12882
diff
changeset
|
336 } |
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
12882
diff
changeset
|
337 } |
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
12882
diff
changeset
|
338 |
12882
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
339 void ciMethodData::set_return_type(int bci, ciKlass* k) { |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
340 VM_ENTRY_MARK; |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
341 MethodData* mdo = get_MethodData(); |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
342 if (mdo != NULL) { |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
343 ProfileData* data = mdo->bci_to_data(bci); |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
344 if (data->is_CallTypeData()) { |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
345 data->as_CallTypeData()->set_return_type(k->get_Klass()); |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
346 } else { |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
347 assert(data->is_VirtualCallTypeData(), "no arguments!"); |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
348 data->as_VirtualCallTypeData()->set_return_type(k->get_Klass()); |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
349 } |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
350 } |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
351 } |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
352 |
0 | 353 bool ciMethodData::has_escape_info() { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
354 return eflag_set(MethodData::estimated); |
0 | 355 } |
356 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
357 void ciMethodData::set_eflag(MethodData::EscapeFlag f) { |
0 | 358 set_bits(_eflags, f); |
359 } | |
360 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
361 void ciMethodData::clear_eflag(MethodData::EscapeFlag f) { |
0 | 362 clear_bits(_eflags, f); |
363 } | |
364 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
365 bool ciMethodData::eflag_set(MethodData::EscapeFlag f) const { |
0 | 366 return mask_bits(_eflags, f) != 0; |
367 } | |
368 | |
369 void ciMethodData::set_arg_local(int i) { | |
370 set_nth_bit(_arg_local, i); | |
371 } | |
372 | |
373 void ciMethodData::set_arg_stack(int i) { | |
374 set_nth_bit(_arg_stack, i); | |
375 } | |
376 | |
377 void ciMethodData::set_arg_returned(int i) { | |
378 set_nth_bit(_arg_returned, i); | |
379 } | |
380 | |
45
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
381 void ciMethodData::set_arg_modified(int arg, uint val) { |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
382 ArgInfoData *aid = arg_info(); |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
383 if (aid == NULL) |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
384 return; |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
385 assert(arg >= 0 && arg < aid->number_of_args(), "valid argument number"); |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
386 aid->set_arg_modified(arg, val); |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
387 } |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
388 |
0 | 389 bool ciMethodData::is_arg_local(int i) const { |
390 return is_set_nth_bit(_arg_local, i); | |
391 } | |
392 | |
393 bool ciMethodData::is_arg_stack(int i) const { | |
394 return is_set_nth_bit(_arg_stack, i); | |
395 } | |
396 | |
397 bool ciMethodData::is_arg_returned(int i) const { | |
398 return is_set_nth_bit(_arg_returned, i); | |
399 } | |
400 | |
45
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
401 uint ciMethodData::arg_modified(int arg) const { |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
402 ArgInfoData *aid = arg_info(); |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
403 if (aid == NULL) |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
404 return 0; |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
405 assert(arg >= 0 && arg < aid->number_of_args(), "valid argument number"); |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
406 return aid->arg_modified(arg); |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
407 } |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
408 |
0 | 409 ByteSize ciMethodData::offset_of_slot(ciProfileData* data, ByteSize slot_offset_in_data) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
410 // Get offset within MethodData* of the data array |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
411 ByteSize data_offset = MethodData::data_offset(); |
0 | 412 |
413 // Get cell offset of the ProfileData within data array | |
414 int cell_offset = dp_to_di(data->dp()); | |
415 | |
416 // Add in counter_offset, the # of bytes into the ProfileData of counter or flag | |
417 int offset = in_bytes(data_offset) + cell_offset + in_bytes(slot_offset_in_data); | |
418 | |
419 return in_ByteSize(offset); | |
420 } | |
421 | |
45
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
422 ciArgInfoData *ciMethodData::arg_info() const { |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
423 // Should be last, have to skip all traps. |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
424 DataLayout* dp = data_layout_at(data_size()); |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
425 DataLayout* end = data_layout_at(data_size() + extra_data_size()); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
426 for (; dp < end; dp = MethodData::next_extra(dp)) { |
45
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
427 if (dp->tag() == DataLayout::arg_info_data_tag) |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
428 return new ciArgInfoData(dp); |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
429 } |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
430 return NULL; |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
431 } |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
432 |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
433 |
0 | 434 // Implementation of the print method. |
435 void ciMethodData::print_impl(outputStream* st) { | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
436 ciMetadata::print_impl(st); |
0 | 437 } |
438 | |
6972
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
439 void ciMethodData::dump_replay_data(outputStream* out) { |
7990
fcc9e7681d63
8006410: allocating without ResourceMark when CompileCommand was specified
vlivanov
parents:
6972
diff
changeset
|
440 ResourceMark rm; |
6972
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
441 MethodData* mdo = get_MethodData(); |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
442 Method* method = mdo->method(); |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
443 Klass* holder = method->method_holder(); |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
444 out->print("ciMethodData %s %s %s %d %d", |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
445 holder->name()->as_quoted_ascii(), |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
446 method->name()->as_quoted_ascii(), |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
447 method->signature()->as_quoted_ascii(), |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
448 _state, |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
449 current_mileage()); |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
450 |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
451 // dump the contents of the MDO header as raw data |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
452 unsigned char* orig = (unsigned char*)&_orig; |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
453 int length = sizeof(_orig); |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
454 out->print(" orig %d", length); |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
455 for (int i = 0; i < length; i++) { |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
456 out->print(" %d", orig[i]); |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
457 } |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
458 |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
459 // dump the MDO data as raw data |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
460 int elements = data_size() / sizeof(intptr_t); |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
461 out->print(" data %d", elements); |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
462 for (int i = 0; i < elements; i++) { |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
463 // We could use INTPTR_FORMAT here but that's a zero justified |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
464 // which makes comparing it with the SA version of this output |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
465 // harder. |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
466 #ifdef _LP64 |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
467 out->print(" 0x%" FORMAT64_MODIFIER "x", data()[i]); |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
468 #else |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
469 out->print(" 0x%x", data()[i]); |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
470 #endif |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
471 } |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
472 |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
473 // The MDO contained oop references as ciObjects, so scan for those |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
474 // and emit pairs of offset and klass name so that they can be |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
475 // reconstructed at runtime. The first round counts the number of |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
476 // oop references and the second actually emits them. |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
477 int count = 0; |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
478 for (int round = 0; round < 2; round++) { |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
479 if (round == 1) out->print(" oops %d", count); |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
480 ProfileData* pdata = first_data(); |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
481 for ( ; is_valid(pdata); pdata = next_data(pdata)) { |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
482 if (pdata->is_ReceiverTypeData()) { |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
483 ciReceiverTypeData* vdata = (ciReceiverTypeData*)pdata; |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
484 for (uint i = 0; i < vdata->row_limit(); i++) { |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
485 ciKlass* k = vdata->receiver(i); |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
486 if (k != NULL) { |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
487 if (round == 0) { |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
488 count++; |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
489 } else { |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
490 out->print(" %d %s", dp_to_di(vdata->dp() + in_bytes(vdata->receiver_offset(i))) / sizeof(intptr_t), k->name()->as_quoted_ascii()); |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
491 } |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
492 } |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
493 } |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
494 } else if (pdata->is_VirtualCallData()) { |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
495 ciVirtualCallData* vdata = (ciVirtualCallData*)pdata; |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
496 for (uint i = 0; i < vdata->row_limit(); i++) { |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
497 ciKlass* k = vdata->receiver(i); |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
498 if (k != NULL) { |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
499 if (round == 0) { |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
500 count++; |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
501 } else { |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
502 out->print(" %d %s", dp_to_di(vdata->dp() + in_bytes(vdata->receiver_offset(i))) / sizeof(intptr_t), k->name()->as_quoted_ascii()); |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
503 } |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
504 } |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
505 } |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
506 } |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
507 } |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
508 } |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
509 out->cr(); |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
510 } |
bd7a7ce2e264
6830717: replay of compilations would help with debugging
minqi
parents:
6725
diff
changeset
|
511 |
0 | 512 #ifndef PRODUCT |
513 void ciMethodData::print() { | |
514 print_data_on(tty); | |
515 } | |
516 | |
517 void ciMethodData::print_data_on(outputStream* st) { | |
518 ResourceMark rm; | |
519 ciProfileData* data; | |
520 for (data = first_data(); is_valid(data); data = next_data(data)) { | |
521 st->print("%d", dp_to_di(data->dp())); | |
522 st->fill_to(6); | |
523 data->print_data_on(st); | |
524 } | |
45
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
525 st->print_cr("--- Extra data:"); |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
526 DataLayout* dp = data_layout_at(data_size()); |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
527 DataLayout* end = data_layout_at(data_size() + extra_data_size()); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
1972
diff
changeset
|
528 for (; dp < end; dp = MethodData::next_extra(dp)) { |
45
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
529 if (dp->tag() == DataLayout::no_tag) continue; |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
530 if (dp->tag() == DataLayout::bit_data_tag) { |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
531 data = new BitData(dp); |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
532 } else { |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
533 assert(dp->tag() == DataLayout::arg_info_data_tag, "must be BitData or ArgInfo"); |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
534 data = new ciArgInfoData(dp); |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
535 dp = end; // ArgInfoData is at the end of extra data section. |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
536 } |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
537 st->print("%d", dp_to_di(data->dp())); |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
538 st->fill_to(6); |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
539 data->print_data_on(st); |
48a3fa21394b
6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents:
0
diff
changeset
|
540 } |
0 | 541 } |
542 | |
12875
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
543 void ciTypeEntries::print_ciklass(outputStream* st, intptr_t k) { |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
544 if (TypeEntries::is_type_none(k)) { |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
545 st->print("none"); |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
546 } else if (TypeEntries::is_type_unknown(k)) { |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
547 st->print("unknown"); |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
548 } else { |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
549 valid_ciklass(k)->print_name_on(st); |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
550 } |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
551 if (TypeEntries::was_null_seen(k)) { |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
552 st->print(" (null seen)"); |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
553 } |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
554 } |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
555 |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
556 void ciTypeStackSlotEntries::print_data_on(outputStream* st) const { |
12882
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
557 for (int i = 0; i < _number_of_entries; i++) { |
12875
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
558 _pd->tab(st); |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
559 st->print("%d: stack (%u) ", i, stack_slot(i)); |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
560 print_ciklass(st, type(i)); |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
561 st->cr(); |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
562 } |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
563 } |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
564 |
12882
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
565 void ciReturnTypeEntry::print_data_on(outputStream* st) const { |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
566 _pd->tab(st); |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
567 st->print("ret "); |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
568 print_ciklass(st, type()); |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
569 st->cr(); |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
570 } |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
571 |
12875
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
572 void ciCallTypeData::print_data_on(outputStream* st) const { |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
573 print_shared(st, "ciCallTypeData"); |
12882
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
574 if (has_arguments()) { |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
575 tab(st, true); |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
576 st->print("argument types"); |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
577 args()->print_data_on(st); |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
578 } |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
579 if (has_return()) { |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
580 tab(st, true); |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
581 st->print("return type"); |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
582 ret()->print_data_on(st); |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
583 } |
12875
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
584 } |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
585 |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
586 void ciReceiverTypeData::print_receiver_data_on(outputStream* st) const { |
0 | 587 uint row; |
588 int entries = 0; | |
589 for (row = 0; row < row_limit(); row++) { | |
590 if (receiver(row) != NULL) entries++; | |
591 } | |
592 st->print_cr("count(%u) entries(%u)", count(), entries); | |
593 for (row = 0; row < row_limit(); row++) { | |
594 if (receiver(row) != NULL) { | |
595 tab(st); | |
596 receiver(row)->print_name_on(st); | |
597 st->print_cr("(%u)", receiver_count(row)); | |
598 } | |
599 } | |
600 } | |
601 | |
12875
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
602 void ciReceiverTypeData::print_data_on(outputStream* st) const { |
0 | 603 print_shared(st, "ciReceiverTypeData"); |
604 print_receiver_data_on(st); | |
605 } | |
606 | |
12875
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
607 void ciVirtualCallData::print_data_on(outputStream* st) const { |
0 | 608 print_shared(st, "ciVirtualCallData"); |
609 rtd_super()->print_receiver_data_on(st); | |
610 } | |
12875
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
611 |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
612 void ciVirtualCallTypeData::print_data_on(outputStream* st) const { |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
613 print_shared(st, "ciVirtualCallTypeData"); |
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
614 rtd_super()->print_receiver_data_on(st); |
12882
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
615 if (has_arguments()) { |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
616 tab(st, true); |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
617 st->print("argument types"); |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
618 args()->print_data_on(st); |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
619 } |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
620 if (has_return()) { |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
621 tab(st, true); |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
622 st->print("return type"); |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
623 ret()->print_data_on(st); |
ce0cc25bc5e2
8026054: New type profiling points: type of return values at calls
roland
parents:
12875
diff
changeset
|
624 } |
12875
d13d7aba8c12
8023657: New type profiling points: arguments to call
roland
parents:
12868
diff
changeset
|
625 } |
12962
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
12882
diff
changeset
|
626 |
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
12882
diff
changeset
|
627 void ciParametersTypeData::print_data_on(outputStream* st) const { |
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
12882
diff
changeset
|
628 st->print_cr("Parametertypes"); |
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
12882
diff
changeset
|
629 parameters()->print_data_on(st); |
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
12882
diff
changeset
|
630 } |
0 | 631 #endif |