annotate src/share/vm/oops/methodData.cpp @ 9126:bc26f978b0ce

HotSpotResolvedObjectType: implement hasFinalizeSubclass() correctly don't use the (wrong) cached value, but ask the runtime on each request. Fixes regression on xml.* benchmarks @ specjvm2008. The problem was: After the constructor of Object was deoptimized due to an assumption violation, it was recompiled again after some time. However, on recompilation, the value of hasFinalizeSubclass for the class was not updated and it was compiled again with a, now wrong, assumption, which then triggers deoptimization again. This was repeated until it hit the recompilation limit (defined by PerMethodRecompilationCutoff), and therefore only executed by the interpreter from now on, causing the performance regression.
author Bernhard Urban <bernhard.urban@jku.at>
date Mon, 15 Apr 2013 19:54:58 +0200
parents 89e4d67fdd2a
children 57e5211846f9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
7956
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 6725
diff changeset
2 * Copyright (c) 2000, 2013, 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: 941
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 941
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: 941
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 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
26 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
27 #include "interpreter/bytecode.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
28 #include "interpreter/bytecodeStream.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
29 #include "interpreter/linkResolver.hpp"
7956
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 6725
diff changeset
30 #include "memory/heapInspection.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
31 #include "oops/methodData.hpp"
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
32 #include "prims/jvmtiRedefineClasses.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
33 #include "runtime/compilationPolicy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
34 #include "runtime/deoptimization.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
35 #include "runtime/handles.inline.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 // ==================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // DataLayout
a61af66fc99e Initial load
duke
parents:
diff changeset
39 //
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // Overlay for generic profiling data.
a61af66fc99e Initial load
duke
parents:
diff changeset
41
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // Some types of data layouts need a length field.
a61af66fc99e Initial load
duke
parents:
diff changeset
43 bool DataLayout::needs_array_len(u1 tag) {
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
44 return (tag == multi_branch_data_tag) || (tag == arg_info_data_tag);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
45 }
a61af66fc99e Initial load
duke
parents:
diff changeset
46
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // Perform generic initialization of the data. More specific
a61af66fc99e Initial load
duke
parents:
diff changeset
48 // initialization occurs in overrides of ProfileData::post_initialize.
a61af66fc99e Initial load
duke
parents:
diff changeset
49 void DataLayout::initialize(u1 tag, u2 bci, int cell_count) {
a61af66fc99e Initial load
duke
parents:
diff changeset
50 _header._bits = (intptr_t)0;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 _header._struct._tag = tag;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 _header._struct._bci = bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 for (int i = 0; i < cell_count; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
54 set_cell_at(i, (intptr_t)0);
a61af66fc99e Initial load
duke
parents:
diff changeset
55 }
a61af66fc99e Initial load
duke
parents:
diff changeset
56 if (needs_array_len(tag)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
57 set_cell_at(ArrayData::array_len_off_set, cell_count - 1); // -1 for header.
a61af66fc99e Initial load
duke
parents:
diff changeset
58 }
a61af66fc99e Initial load
duke
parents:
diff changeset
59 }
a61af66fc99e Initial load
duke
parents:
diff changeset
60
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
61 void DataLayout::clean_weak_klass_links(BoolObjectClosure* cl) {
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 844
diff changeset
62 ResourceMark m;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
63 data_in()->clean_weak_klass_links(cl);
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 844
diff changeset
64 }
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 844
diff changeset
65
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 844
diff changeset
66
0
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // ==================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // ProfileData
a61af66fc99e Initial load
duke
parents:
diff changeset
69 //
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // A ProfileData object is created to refer to a section of profiling
a61af66fc99e Initial load
duke
parents:
diff changeset
71 // data in a structured way.
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // Constructor for invalid ProfileData.
a61af66fc99e Initial load
duke
parents:
diff changeset
74 ProfileData::ProfileData() {
a61af66fc99e Initial load
duke
parents:
diff changeset
75 _data = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
76 }
a61af66fc99e Initial load
duke
parents:
diff changeset
77
a61af66fc99e Initial load
duke
parents:
diff changeset
78 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
79 void ProfileData::print_shared(outputStream* st, const char* name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
80 st->print("bci: %d", bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
81 st->fill_to(tab_width_one);
a61af66fc99e Initial load
duke
parents:
diff changeset
82 st->print("%s", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
83 tab(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
84 int trap = trap_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
85 if (trap != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
86 char buf[100];
a61af66fc99e Initial load
duke
parents:
diff changeset
87 st->print("trap(%s) ", Deoptimization::format_trap_state(buf, sizeof(buf), trap));
a61af66fc99e Initial load
duke
parents:
diff changeset
88 }
a61af66fc99e Initial load
duke
parents:
diff changeset
89 int flags = data()->flags();
a61af66fc99e Initial load
duke
parents:
diff changeset
90 if (flags != 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
91 st->print("flags(%d) ", flags);
a61af66fc99e Initial load
duke
parents:
diff changeset
92 }
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94 void ProfileData::tab(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
95 st->fill_to(tab_width_two);
a61af66fc99e Initial load
duke
parents:
diff changeset
96 }
a61af66fc99e Initial load
duke
parents:
diff changeset
97 #endif // !PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // ==================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // BitData
a61af66fc99e Initial load
duke
parents:
diff changeset
101 //
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // A BitData corresponds to a one-bit flag. This is used to indicate
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // whether a checkcast bytecode has seen a null value.
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
107 void BitData::print_data_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
108 print_shared(st, "BitData");
a61af66fc99e Initial load
duke
parents:
diff changeset
109 }
a61af66fc99e Initial load
duke
parents:
diff changeset
110 #endif // !PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // ==================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // CounterData
a61af66fc99e Initial load
duke
parents:
diff changeset
114 //
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // A CounterData corresponds to a simple counter.
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
118 void CounterData::print_data_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
119 print_shared(st, "CounterData");
a61af66fc99e Initial load
duke
parents:
diff changeset
120 st->print_cr("count(%u)", count());
a61af66fc99e Initial load
duke
parents:
diff changeset
121 }
a61af66fc99e Initial load
duke
parents:
diff changeset
122 #endif // !PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 // ==================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
125 // JumpData
a61af66fc99e Initial load
duke
parents:
diff changeset
126 //
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // A JumpData is used to access profiling information for a direct
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // branch. It is a counter, used for counting the number of branches,
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // plus a data displacement, used for realigning the data pointer to
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // the corresponding target bci.
a61af66fc99e Initial load
duke
parents:
diff changeset
131
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
132 void JumpData::post_initialize(BytecodeStream* stream, MethodData* mdo) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
133 assert(stream->bci() == bci(), "wrong pos");
a61af66fc99e Initial load
duke
parents:
diff changeset
134 int target;
a61af66fc99e Initial load
duke
parents:
diff changeset
135 Bytecodes::Code c = stream->code();
a61af66fc99e Initial load
duke
parents:
diff changeset
136 if (c == Bytecodes::_goto_w || c == Bytecodes::_jsr_w) {
a61af66fc99e Initial load
duke
parents:
diff changeset
137 target = stream->dest_w();
a61af66fc99e Initial load
duke
parents:
diff changeset
138 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
139 target = stream->dest();
a61af66fc99e Initial load
duke
parents:
diff changeset
140 }
a61af66fc99e Initial load
duke
parents:
diff changeset
141 int my_di = mdo->dp_to_di(dp());
a61af66fc99e Initial load
duke
parents:
diff changeset
142 int target_di = mdo->bci_to_di(target);
a61af66fc99e Initial load
duke
parents:
diff changeset
143 int offset = target_di - my_di;
a61af66fc99e Initial load
duke
parents:
diff changeset
144 set_displacement(offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
145 }
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
148 void JumpData::print_data_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
149 print_shared(st, "JumpData");
a61af66fc99e Initial load
duke
parents:
diff changeset
150 st->print_cr("taken(%u) displacement(%d)", taken(), displacement());
a61af66fc99e Initial load
duke
parents:
diff changeset
151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
152 #endif // !PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 // ==================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // ReceiverTypeData
a61af66fc99e Initial load
duke
parents:
diff changeset
156 //
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // A ReceiverTypeData is used to access profiling information about a
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // dynamic type check. It consists of a counter which counts the total times
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
159 // that the check is reached, and a series of (Klass*, count) pairs
0
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // which are used to store a type profile for the receiver of the check.
a61af66fc99e Initial load
duke
parents:
diff changeset
161
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
162 void ReceiverTypeData::clean_weak_klass_links(BoolObjectClosure* is_alive_cl) {
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 844
diff changeset
163 for (uint row = 0; row < row_limit(); row++) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
164 Klass* p = receiver(row);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
165 if (p != NULL && !p->is_loader_alive(is_alive_cl)) {
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 844
diff changeset
166 clear_row(row);
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 844
diff changeset
167 }
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 844
diff changeset
168 }
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 844
diff changeset
169 }
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 844
diff changeset
170
0
a61af66fc99e Initial load
duke
parents:
diff changeset
171 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
172 void ReceiverTypeData::print_receiver_data_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
173 uint row;
a61af66fc99e Initial load
duke
parents:
diff changeset
174 int entries = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
175 for (row = 0; row < row_limit(); row++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
176 if (receiver(row) != NULL) entries++;
a61af66fc99e Initial load
duke
parents:
diff changeset
177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
178 st->print_cr("count(%u) entries(%u)", count(), entries);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
179 int total = count();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
180 for (row = 0; row < row_limit(); row++) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
181 if (receiver(row) != NULL) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
182 total += receiver_count(row);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
183 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
184 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
185 for (row = 0; row < row_limit(); row++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
186 if (receiver(row) != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
187 tab(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
188 receiver(row)->print_value_on(st);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
189 st->print_cr("(%u %4.2f)", receiver_count(row), (float) receiver_count(row) / (float) total);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
190 }
a61af66fc99e Initial load
duke
parents:
diff changeset
191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
192 }
a61af66fc99e Initial load
duke
parents:
diff changeset
193 void ReceiverTypeData::print_data_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
194 print_shared(st, "ReceiverTypeData");
a61af66fc99e Initial load
duke
parents:
diff changeset
195 print_receiver_data_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
196 }
a61af66fc99e Initial load
duke
parents:
diff changeset
197 void VirtualCallData::print_data_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
198 print_shared(st, "VirtualCallData");
a61af66fc99e Initial load
duke
parents:
diff changeset
199 print_receiver_data_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
200 }
a61af66fc99e Initial load
duke
parents:
diff changeset
201 #endif // !PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
202
a61af66fc99e Initial load
duke
parents:
diff changeset
203 // ==================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // RetData
a61af66fc99e Initial load
duke
parents:
diff changeset
205 //
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // A RetData is used to access profiling information for a ret bytecode.
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // It is composed of a count of the number of times that the ret has
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // been executed, followed by a series of triples of the form
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // (bci, count, di) which count the number of times that some bci was the
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // target of the ret and cache a corresponding displacement.
a61af66fc99e Initial load
duke
parents:
diff changeset
211
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
212 void RetData::post_initialize(BytecodeStream* stream, MethodData* mdo) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
213 for (uint row = 0; row < row_limit(); row++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
214 set_bci_displacement(row, -1);
a61af66fc99e Initial load
duke
parents:
diff changeset
215 set_bci(row, no_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
217 // release so other threads see a consistent state. bci is used as
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // a valid flag for bci_displacement.
a61af66fc99e Initial load
duke
parents:
diff changeset
219 OrderAccess::release();
a61af66fc99e Initial load
duke
parents:
diff changeset
220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222 // This routine needs to atomically update the RetData structure, so the
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // caller needs to hold the RetData_lock before it gets here. Since taking
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // the lock can block (and allow GC) and since RetData is a ProfileData is a
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // wrapper around a derived oop, taking the lock in _this_ method will
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // basically cause the 'this' pointer's _data field to contain junk after the
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // lock. We require the caller to take the lock before making the ProfileData
a61af66fc99e Initial load
duke
parents:
diff changeset
228 // structure. Currently the only caller is InterpreterRuntime::update_mdp_for_ret
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
229 address RetData::fixup_ret(int return_bci, MethodData* h_mdo) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // First find the mdp which corresponds to the return bci.
a61af66fc99e Initial load
duke
parents:
diff changeset
231 address mdp = h_mdo->bci_to_dp(return_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
232
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // Now check to see if any of the cache slots are open.
a61af66fc99e Initial load
duke
parents:
diff changeset
234 for (uint row = 0; row < row_limit(); row++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
235 if (bci(row) == no_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
236 set_bci_displacement(row, mdp - dp());
a61af66fc99e Initial load
duke
parents:
diff changeset
237 set_bci_count(row, DataLayout::counter_increment);
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // Barrier to ensure displacement is written before the bci; allows
a61af66fc99e Initial load
duke
parents:
diff changeset
239 // the interpreter to read displacement without fear of race condition.
a61af66fc99e Initial load
duke
parents:
diff changeset
240 release_set_bci(row, return_bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
241 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
242 }
a61af66fc99e Initial load
duke
parents:
diff changeset
243 }
a61af66fc99e Initial load
duke
parents:
diff changeset
244 return mdp;
a61af66fc99e Initial load
duke
parents:
diff changeset
245 }
a61af66fc99e Initial load
duke
parents:
diff changeset
246
a61af66fc99e Initial load
duke
parents:
diff changeset
247
a61af66fc99e Initial load
duke
parents:
diff changeset
248 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
249 void RetData::print_data_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
250 print_shared(st, "RetData");
a61af66fc99e Initial load
duke
parents:
diff changeset
251 uint row;
a61af66fc99e Initial load
duke
parents:
diff changeset
252 int entries = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
253 for (row = 0; row < row_limit(); row++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
254 if (bci(row) != no_bci) entries++;
a61af66fc99e Initial load
duke
parents:
diff changeset
255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
256 st->print_cr("count(%u) entries(%u)", count(), entries);
a61af66fc99e Initial load
duke
parents:
diff changeset
257 for (row = 0; row < row_limit(); row++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
258 if (bci(row) != no_bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
259 tab(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
260 st->print_cr("bci(%d: count(%u) displacement(%d))",
a61af66fc99e Initial load
duke
parents:
diff changeset
261 bci(row), bci_count(row), bci_displacement(row));
a61af66fc99e Initial load
duke
parents:
diff changeset
262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
265 #endif // !PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
266
a61af66fc99e Initial load
duke
parents:
diff changeset
267 // ==================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
268 // BranchData
a61af66fc99e Initial load
duke
parents:
diff changeset
269 //
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // A BranchData is used to access profiling data for a two-way branch.
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // It consists of taken and not_taken counts as well as a data displacement
a61af66fc99e Initial load
duke
parents:
diff changeset
272 // for the taken case.
a61af66fc99e Initial load
duke
parents:
diff changeset
273
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
274 void BranchData::post_initialize(BytecodeStream* stream, MethodData* mdo) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
275 assert(stream->bci() == bci(), "wrong pos");
a61af66fc99e Initial load
duke
parents:
diff changeset
276 int target = stream->dest();
a61af66fc99e Initial load
duke
parents:
diff changeset
277 int my_di = mdo->dp_to_di(dp());
a61af66fc99e Initial load
duke
parents:
diff changeset
278 int target_di = mdo->bci_to_di(target);
a61af66fc99e Initial load
duke
parents:
diff changeset
279 int offset = target_di - my_di;
a61af66fc99e Initial load
duke
parents:
diff changeset
280 set_displacement(offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
282
a61af66fc99e Initial load
duke
parents:
diff changeset
283 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
284 void BranchData::print_data_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
285 print_shared(st, "BranchData");
a61af66fc99e Initial load
duke
parents:
diff changeset
286 st->print_cr("taken(%u) displacement(%d)",
a61af66fc99e Initial load
duke
parents:
diff changeset
287 taken(), displacement());
a61af66fc99e Initial load
duke
parents:
diff changeset
288 tab(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
289 st->print_cr("not taken(%u)", not_taken());
a61af66fc99e Initial load
duke
parents:
diff changeset
290 }
a61af66fc99e Initial load
duke
parents:
diff changeset
291 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293 // ==================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
294 // MultiBranchData
a61af66fc99e Initial load
duke
parents:
diff changeset
295 //
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // A MultiBranchData is used to access profiling information for
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // a multi-way branch (*switch bytecodes). It consists of a series
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // of (count, displacement) pairs, which count the number of times each
a61af66fc99e Initial load
duke
parents:
diff changeset
299 // case was taken and specify the data displacment for each branch target.
a61af66fc99e Initial load
duke
parents:
diff changeset
300
a61af66fc99e Initial load
duke
parents:
diff changeset
301 int MultiBranchData::compute_cell_count(BytecodeStream* stream) {
a61af66fc99e Initial load
duke
parents:
diff changeset
302 int cell_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
303 if (stream->code() == Bytecodes::_tableswitch) {
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
304 Bytecode_tableswitch sw(stream->method()(), stream->bcp());
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
305 cell_count = 1 + per_case_cell_count * (1 + sw.length()); // 1 for default
0
a61af66fc99e Initial load
duke
parents:
diff changeset
306 } else {
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
307 Bytecode_lookupswitch sw(stream->method()(), stream->bcp());
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
308 cell_count = 1 + per_case_cell_count * (sw.number_of_pairs() + 1); // 1 for default
0
a61af66fc99e Initial load
duke
parents:
diff changeset
309 }
a61af66fc99e Initial load
duke
parents:
diff changeset
310 return cell_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
311 }
a61af66fc99e Initial load
duke
parents:
diff changeset
312
a61af66fc99e Initial load
duke
parents:
diff changeset
313 void MultiBranchData::post_initialize(BytecodeStream* stream,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
314 MethodData* mdo) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
315 assert(stream->bci() == bci(), "wrong pos");
a61af66fc99e Initial load
duke
parents:
diff changeset
316 int target;
a61af66fc99e Initial load
duke
parents:
diff changeset
317 int my_di;
a61af66fc99e Initial load
duke
parents:
diff changeset
318 int target_di;
a61af66fc99e Initial load
duke
parents:
diff changeset
319 int offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
320 if (stream->code() == Bytecodes::_tableswitch) {
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
321 Bytecode_tableswitch sw(stream->method()(), stream->bcp());
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
322 int len = sw.length();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
323 assert(array_len() == per_case_cell_count * (len + 1), "wrong len");
a61af66fc99e Initial load
duke
parents:
diff changeset
324 for (int count = 0; count < len; count++) {
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
325 target = sw.dest_offset_at(count) + bci();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
326 my_di = mdo->dp_to_di(dp());
a61af66fc99e Initial load
duke
parents:
diff changeset
327 target_di = mdo->bci_to_di(target);
a61af66fc99e Initial load
duke
parents:
diff changeset
328 offset = target_di - my_di;
a61af66fc99e Initial load
duke
parents:
diff changeset
329 set_displacement_at(count, offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
330 }
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
331 target = sw.default_offset() + bci();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
332 my_di = mdo->dp_to_di(dp());
a61af66fc99e Initial load
duke
parents:
diff changeset
333 target_di = mdo->bci_to_di(target);
a61af66fc99e Initial load
duke
parents:
diff changeset
334 offset = target_di - my_di;
a61af66fc99e Initial load
duke
parents:
diff changeset
335 set_default_displacement(offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
336
a61af66fc99e Initial load
duke
parents:
diff changeset
337 } else {
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
338 Bytecode_lookupswitch sw(stream->method()(), stream->bcp());
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
339 int npairs = sw.number_of_pairs();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
340 assert(array_len() == per_case_cell_count * (npairs + 1), "wrong len");
a61af66fc99e Initial load
duke
parents:
diff changeset
341 for (int count = 0; count < npairs; count++) {
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
342 LookupswitchPair pair = sw.pair_at(count);
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
343 target = pair.offset() + bci();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
344 my_di = mdo->dp_to_di(dp());
a61af66fc99e Initial load
duke
parents:
diff changeset
345 target_di = mdo->bci_to_di(target);
a61af66fc99e Initial load
duke
parents:
diff changeset
346 offset = target_di - my_di;
a61af66fc99e Initial load
duke
parents:
diff changeset
347 set_displacement_at(count, offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
348 }
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
349 target = sw.default_offset() + bci();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
350 my_di = mdo->dp_to_di(dp());
a61af66fc99e Initial load
duke
parents:
diff changeset
351 target_di = mdo->bci_to_di(target);
a61af66fc99e Initial load
duke
parents:
diff changeset
352 offset = target_di - my_di;
a61af66fc99e Initial load
duke
parents:
diff changeset
353 set_default_displacement(offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
355 }
a61af66fc99e Initial load
duke
parents:
diff changeset
356
a61af66fc99e Initial load
duke
parents:
diff changeset
357 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
358 void MultiBranchData::print_data_on(outputStream* st) {
a61af66fc99e Initial load
duke
parents:
diff changeset
359 print_shared(st, "MultiBranchData");
a61af66fc99e Initial load
duke
parents:
diff changeset
360 st->print_cr("default_count(%u) displacement(%d)",
a61af66fc99e Initial load
duke
parents:
diff changeset
361 default_count(), default_displacement());
a61af66fc99e Initial load
duke
parents:
diff changeset
362 int cases = number_of_cases();
a61af66fc99e Initial load
duke
parents:
diff changeset
363 for (int i = 0; i < cases; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
364 tab(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
365 st->print_cr("count(%u) displacement(%d)",
a61af66fc99e Initial load
duke
parents:
diff changeset
366 count_at(i), displacement_at(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
367 }
a61af66fc99e Initial load
duke
parents:
diff changeset
368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
369 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
370
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
371 #ifndef PRODUCT
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
372 void ArgInfoData::print_data_on(outputStream* st) {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
373 print_shared(st, "ArgInfoData");
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
374 int nargs = number_of_args();
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
375 for (int i = 0; i < nargs; i++) {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
376 st->print(" 0x%x", arg_modified(i));
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
377 }
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
378 st->cr();
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
379 }
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
380
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
381 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
382 // ==================================================================
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
383 // MethodData*
0
a61af66fc99e Initial load
duke
parents:
diff changeset
384 //
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
385 // A MethodData* holds information which has been collected about
0
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // a method.
a61af66fc99e Initial load
duke
parents:
diff changeset
387
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
388 MethodData* MethodData::allocate(ClassLoaderData* loader_data, methodHandle method, TRAPS) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
389 int size = MethodData::compute_allocation_size_in_words(method);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
390
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
391 return new (loader_data, size, false, THREAD) MethodData(method(), size, CHECK_NULL);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
392 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
393
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
394 int MethodData::bytecode_cell_count(Bytecodes::Code code) {
8883
b9a918201d47 Merge with hsx25
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 8616 8860
diff changeset
395 #if defined(COMPILER1) && !(defined(COMPILER2) || defined(GRAAL))
8860
46f6f063b272 7153771: array bound check elimination for c1
roland
parents: 8712
diff changeset
396 return no_profile_data;
46f6f063b272 7153771: array bound check elimination for c1
roland
parents: 8712
diff changeset
397 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
398 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
399 case Bytecodes::_checkcast:
a61af66fc99e Initial load
duke
parents:
diff changeset
400 case Bytecodes::_instanceof:
a61af66fc99e Initial load
duke
parents:
diff changeset
401 case Bytecodes::_aastore:
a61af66fc99e Initial load
duke
parents:
diff changeset
402 if (TypeProfileCasts) {
a61af66fc99e Initial load
duke
parents:
diff changeset
403 return ReceiverTypeData::static_cell_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
404 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
405 return BitData::static_cell_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
406 }
a61af66fc99e Initial load
duke
parents:
diff changeset
407 case Bytecodes::_invokespecial:
a61af66fc99e Initial load
duke
parents:
diff changeset
408 case Bytecodes::_invokestatic:
a61af66fc99e Initial load
duke
parents:
diff changeset
409 return CounterData::static_cell_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
410 case Bytecodes::_goto:
a61af66fc99e Initial load
duke
parents:
diff changeset
411 case Bytecodes::_goto_w:
a61af66fc99e Initial load
duke
parents:
diff changeset
412 case Bytecodes::_jsr:
a61af66fc99e Initial load
duke
parents:
diff changeset
413 case Bytecodes::_jsr_w:
a61af66fc99e Initial load
duke
parents:
diff changeset
414 return JumpData::static_cell_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
415 case Bytecodes::_invokevirtual:
a61af66fc99e Initial load
duke
parents:
diff changeset
416 case Bytecodes::_invokeinterface:
a61af66fc99e Initial load
duke
parents:
diff changeset
417 return VirtualCallData::static_cell_count();
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 196
diff changeset
418 case Bytecodes::_invokedynamic:
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 196
diff changeset
419 return CounterData::static_cell_count();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
420 case Bytecodes::_ret:
a61af66fc99e Initial load
duke
parents:
diff changeset
421 return RetData::static_cell_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
422 case Bytecodes::_ifeq:
a61af66fc99e Initial load
duke
parents:
diff changeset
423 case Bytecodes::_ifne:
a61af66fc99e Initial load
duke
parents:
diff changeset
424 case Bytecodes::_iflt:
a61af66fc99e Initial load
duke
parents:
diff changeset
425 case Bytecodes::_ifge:
a61af66fc99e Initial load
duke
parents:
diff changeset
426 case Bytecodes::_ifgt:
a61af66fc99e Initial load
duke
parents:
diff changeset
427 case Bytecodes::_ifle:
a61af66fc99e Initial load
duke
parents:
diff changeset
428 case Bytecodes::_if_icmpeq:
a61af66fc99e Initial load
duke
parents:
diff changeset
429 case Bytecodes::_if_icmpne:
a61af66fc99e Initial load
duke
parents:
diff changeset
430 case Bytecodes::_if_icmplt:
a61af66fc99e Initial load
duke
parents:
diff changeset
431 case Bytecodes::_if_icmpge:
a61af66fc99e Initial load
duke
parents:
diff changeset
432 case Bytecodes::_if_icmpgt:
a61af66fc99e Initial load
duke
parents:
diff changeset
433 case Bytecodes::_if_icmple:
a61af66fc99e Initial load
duke
parents:
diff changeset
434 case Bytecodes::_if_acmpeq:
a61af66fc99e Initial load
duke
parents:
diff changeset
435 case Bytecodes::_if_acmpne:
a61af66fc99e Initial load
duke
parents:
diff changeset
436 case Bytecodes::_ifnull:
a61af66fc99e Initial load
duke
parents:
diff changeset
437 case Bytecodes::_ifnonnull:
a61af66fc99e Initial load
duke
parents:
diff changeset
438 return BranchData::static_cell_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
439 case Bytecodes::_lookupswitch:
a61af66fc99e Initial load
duke
parents:
diff changeset
440 case Bytecodes::_tableswitch:
a61af66fc99e Initial load
duke
parents:
diff changeset
441 return variable_cell_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
442 }
a61af66fc99e Initial load
duke
parents:
diff changeset
443 return no_profile_data;
8860
46f6f063b272 7153771: array bound check elimination for c1
roland
parents: 8712
diff changeset
444 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
445 }
a61af66fc99e Initial load
duke
parents:
diff changeset
446
a61af66fc99e Initial load
duke
parents:
diff changeset
447 // Compute the size of the profiling information corresponding to
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // the current bytecode.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
449 int MethodData::compute_data_size(BytecodeStream* stream) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
450 int cell_count = bytecode_cell_count(stream->code());
a61af66fc99e Initial load
duke
parents:
diff changeset
451 if (cell_count == no_profile_data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
452 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
453 }
a61af66fc99e Initial load
duke
parents:
diff changeset
454 if (cell_count == variable_cell_count) {
a61af66fc99e Initial load
duke
parents:
diff changeset
455 cell_count = MultiBranchData::compute_cell_count(stream);
a61af66fc99e Initial load
duke
parents:
diff changeset
456 }
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // Note: cell_count might be zero, meaning that there is just
a61af66fc99e Initial load
duke
parents:
diff changeset
458 // a DataLayout header, with no extra cells.
a61af66fc99e Initial load
duke
parents:
diff changeset
459 assert(cell_count >= 0, "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
460 return DataLayout::compute_size_in_bytes(cell_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
461 }
a61af66fc99e Initial load
duke
parents:
diff changeset
462
8616
d343737786fe changed profiling of exceptions so that the ExceptionSeen flag also works without GRAALVM
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8615
diff changeset
463 #ifdef GRAAL
6948
e522a00b91aa Merge with http://hg.openjdk.java.net/hsx/hsx25/hotspot/ after NPG - C++ build works
Doug Simon <doug.simon@oracle.com>
parents: 5150 6725
diff changeset
464 int MethodData::compute_extra_data_count(int data_size, int empty_bc_count) {
4568
8e1d9c27989a better allocation of methodData's extraData so that exceptions and deoptimizations can be recorded more accurately
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4439
diff changeset
465 if (!ProfileTraps) return 0;
8e1d9c27989a better allocation of methodData's extraData so that exceptions and deoptimizations can be recorded more accurately
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4439
diff changeset
466
8e1d9c27989a better allocation of methodData's extraData so that exceptions and deoptimizations can be recorded more accurately
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4439
diff changeset
467 // Assume that up to 30% of the possibly trapping BCIs with no MDP will need to allocate one.
8e1d9c27989a better allocation of methodData's extraData so that exceptions and deoptimizations can be recorded more accurately
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4439
diff changeset
468 return MIN2(empty_bc_count, MAX2(4, (empty_bc_count * 30) / 100));
8e1d9c27989a better allocation of methodData's extraData so that exceptions and deoptimizations can be recorded more accurately
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4439
diff changeset
469 }
8e1d9c27989a better allocation of methodData's extraData so that exceptions and deoptimizations can be recorded more accurately
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4439
diff changeset
470 #else
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
471 int MethodData::compute_extra_data_count(int data_size, int empty_bc_count) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
472 if (ProfileTraps) {
a61af66fc99e Initial load
duke
parents:
diff changeset
473 // Assume that up to 3% of BCIs with no MDP will need to allocate one.
a61af66fc99e Initial load
duke
parents:
diff changeset
474 int extra_data_count = (uint)(empty_bc_count * 3) / 128 + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
475 // If the method is large, let the extra BCIs grow numerous (to ~1%).
a61af66fc99e Initial load
duke
parents:
diff changeset
476 int one_percent_of_data
a61af66fc99e Initial load
duke
parents:
diff changeset
477 = (uint)data_size / (DataLayout::header_size_in_bytes()*128);
a61af66fc99e Initial load
duke
parents:
diff changeset
478 if (extra_data_count < one_percent_of_data)
a61af66fc99e Initial load
duke
parents:
diff changeset
479 extra_data_count = one_percent_of_data;
a61af66fc99e Initial load
duke
parents:
diff changeset
480 if (extra_data_count > empty_bc_count)
a61af66fc99e Initial load
duke
parents:
diff changeset
481 extra_data_count = empty_bc_count; // no need for more
a61af66fc99e Initial load
duke
parents:
diff changeset
482 return extra_data_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
483 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
484 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
485 }
a61af66fc99e Initial load
duke
parents:
diff changeset
486 }
4568
8e1d9c27989a better allocation of methodData's extraData so that exceptions and deoptimizations can be recorded more accurately
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4439
diff changeset
487 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
488
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
489 // Compute the size of the MethodData* necessary to store
0
a61af66fc99e Initial load
duke
parents:
diff changeset
490 // profiling information about a given method. Size is in bytes.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
491 int MethodData::compute_allocation_size_in_bytes(methodHandle method) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
492 int data_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
493 BytecodeStream stream(method);
a61af66fc99e Initial load
duke
parents:
diff changeset
494 Bytecodes::Code c;
a61af66fc99e Initial load
duke
parents:
diff changeset
495 int empty_bc_count = 0; // number of bytecodes lacking data
a61af66fc99e Initial load
duke
parents:
diff changeset
496 while ((c = stream.next()) >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
497 int size_in_bytes = compute_data_size(&stream);
a61af66fc99e Initial load
duke
parents:
diff changeset
498 data_size += size_in_bytes;
4568
8e1d9c27989a better allocation of methodData's extraData so that exceptions and deoptimizations can be recorded more accurately
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4439
diff changeset
499
8e1d9c27989a better allocation of methodData's extraData so that exceptions and deoptimizations can be recorded more accurately
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4439
diff changeset
500 if (is_empty_data(size_in_bytes, c)) empty_bc_count++;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
501 }
a61af66fc99e Initial load
duke
parents:
diff changeset
502 int object_size = in_bytes(data_offset()) + data_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
503
a61af66fc99e Initial load
duke
parents:
diff changeset
504 // Add some extra DataLayout cells (at least one) to track stray traps.
a61af66fc99e Initial load
duke
parents:
diff changeset
505 int extra_data_count = compute_extra_data_count(data_size, empty_bc_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
506 object_size += extra_data_count * DataLayout::compute_size_in_bytes(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
507
7154
5d0bb7d52783 changes to support Graal co-existing with the other HotSpot compiler(s) and being used for explicit compilation requests and code installation via the Graal API
Doug Simon <doug.simon@oracle.com>
parents: 6948
diff changeset
508 #ifndef GRAALVM
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
509 // Add a cell to record information about modified arguments.
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
510 int arg_size = method->size_of_parameters();
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
511 object_size += DataLayout::compute_size_in_bytes(arg_size+1);
4568
8e1d9c27989a better allocation of methodData's extraData so that exceptions and deoptimizations can be recorded more accurately
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4439
diff changeset
512 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
513 return object_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
514 }
a61af66fc99e Initial load
duke
parents:
diff changeset
515
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
516 // Compute the size of the MethodData* necessary to store
0
a61af66fc99e Initial load
duke
parents:
diff changeset
517 // profiling information about a given method. Size is in words
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
518 int MethodData::compute_allocation_size_in_words(methodHandle method) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
519 int byte_size = compute_allocation_size_in_bytes(method);
a61af66fc99e Initial load
duke
parents:
diff changeset
520 int word_size = align_size_up(byte_size, BytesPerWord) / BytesPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
521 return align_object_size(word_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
522 }
a61af66fc99e Initial load
duke
parents:
diff changeset
523
a61af66fc99e Initial load
duke
parents:
diff changeset
524 // Initialize an individual data segment. Returns the size of
a61af66fc99e Initial load
duke
parents:
diff changeset
525 // the segment in bytes.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
526 int MethodData::initialize_data(BytecodeStream* stream,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
527 int data_index) {
8883
b9a918201d47 Merge with hsx25
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 8616 8860
diff changeset
528 #if defined(COMPILER1) && !(defined(COMPILER2) || defined(GRAAL))
8860
46f6f063b272 7153771: array bound check elimination for c1
roland
parents: 8712
diff changeset
529 return 0;
46f6f063b272 7153771: array bound check elimination for c1
roland
parents: 8712
diff changeset
530 #else
0
a61af66fc99e Initial load
duke
parents:
diff changeset
531 int cell_count = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
532 int tag = DataLayout::no_tag;
a61af66fc99e Initial load
duke
parents:
diff changeset
533 DataLayout* data_layout = data_layout_at(data_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
534 Bytecodes::Code c = stream->code();
a61af66fc99e Initial load
duke
parents:
diff changeset
535 switch (c) {
a61af66fc99e Initial load
duke
parents:
diff changeset
536 case Bytecodes::_checkcast:
a61af66fc99e Initial load
duke
parents:
diff changeset
537 case Bytecodes::_instanceof:
a61af66fc99e Initial load
duke
parents:
diff changeset
538 case Bytecodes::_aastore:
a61af66fc99e Initial load
duke
parents:
diff changeset
539 if (TypeProfileCasts) {
a61af66fc99e Initial load
duke
parents:
diff changeset
540 cell_count = ReceiverTypeData::static_cell_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
541 tag = DataLayout::receiver_type_data_tag;
a61af66fc99e Initial load
duke
parents:
diff changeset
542 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
543 cell_count = BitData::static_cell_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
544 tag = DataLayout::bit_data_tag;
a61af66fc99e Initial load
duke
parents:
diff changeset
545 }
a61af66fc99e Initial load
duke
parents:
diff changeset
546 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
547 case Bytecodes::_invokespecial:
a61af66fc99e Initial load
duke
parents:
diff changeset
548 case Bytecodes::_invokestatic:
a61af66fc99e Initial load
duke
parents:
diff changeset
549 cell_count = CounterData::static_cell_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
550 tag = DataLayout::counter_data_tag;
a61af66fc99e Initial load
duke
parents:
diff changeset
551 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
552 case Bytecodes::_goto:
a61af66fc99e Initial load
duke
parents:
diff changeset
553 case Bytecodes::_goto_w:
a61af66fc99e Initial load
duke
parents:
diff changeset
554 case Bytecodes::_jsr:
a61af66fc99e Initial load
duke
parents:
diff changeset
555 case Bytecodes::_jsr_w:
a61af66fc99e Initial load
duke
parents:
diff changeset
556 cell_count = JumpData::static_cell_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
557 tag = DataLayout::jump_data_tag;
a61af66fc99e Initial load
duke
parents:
diff changeset
558 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
559 case Bytecodes::_invokevirtual:
a61af66fc99e Initial load
duke
parents:
diff changeset
560 case Bytecodes::_invokeinterface:
a61af66fc99e Initial load
duke
parents:
diff changeset
561 cell_count = VirtualCallData::static_cell_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
562 tag = DataLayout::virtual_call_data_tag;
a61af66fc99e Initial load
duke
parents:
diff changeset
563 break;
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 196
diff changeset
564 case Bytecodes::_invokedynamic:
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 196
diff changeset
565 // %%% should make a type profile for any invokedynamic that takes a ref argument
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 196
diff changeset
566 cell_count = CounterData::static_cell_count();
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 196
diff changeset
567 tag = DataLayout::counter_data_tag;
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 196
diff changeset
568 break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
569 case Bytecodes::_ret:
a61af66fc99e Initial load
duke
parents:
diff changeset
570 cell_count = RetData::static_cell_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
571 tag = DataLayout::ret_data_tag;
a61af66fc99e Initial load
duke
parents:
diff changeset
572 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
573 case Bytecodes::_ifeq:
a61af66fc99e Initial load
duke
parents:
diff changeset
574 case Bytecodes::_ifne:
a61af66fc99e Initial load
duke
parents:
diff changeset
575 case Bytecodes::_iflt:
a61af66fc99e Initial load
duke
parents:
diff changeset
576 case Bytecodes::_ifge:
a61af66fc99e Initial load
duke
parents:
diff changeset
577 case Bytecodes::_ifgt:
a61af66fc99e Initial load
duke
parents:
diff changeset
578 case Bytecodes::_ifle:
a61af66fc99e Initial load
duke
parents:
diff changeset
579 case Bytecodes::_if_icmpeq:
a61af66fc99e Initial load
duke
parents:
diff changeset
580 case Bytecodes::_if_icmpne:
a61af66fc99e Initial load
duke
parents:
diff changeset
581 case Bytecodes::_if_icmplt:
a61af66fc99e Initial load
duke
parents:
diff changeset
582 case Bytecodes::_if_icmpge:
a61af66fc99e Initial load
duke
parents:
diff changeset
583 case Bytecodes::_if_icmpgt:
a61af66fc99e Initial load
duke
parents:
diff changeset
584 case Bytecodes::_if_icmple:
a61af66fc99e Initial load
duke
parents:
diff changeset
585 case Bytecodes::_if_acmpeq:
a61af66fc99e Initial load
duke
parents:
diff changeset
586 case Bytecodes::_if_acmpne:
a61af66fc99e Initial load
duke
parents:
diff changeset
587 case Bytecodes::_ifnull:
a61af66fc99e Initial load
duke
parents:
diff changeset
588 case Bytecodes::_ifnonnull:
a61af66fc99e Initial load
duke
parents:
diff changeset
589 cell_count = BranchData::static_cell_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
590 tag = DataLayout::branch_data_tag;
a61af66fc99e Initial load
duke
parents:
diff changeset
591 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
592 case Bytecodes::_lookupswitch:
a61af66fc99e Initial load
duke
parents:
diff changeset
593 case Bytecodes::_tableswitch:
a61af66fc99e Initial load
duke
parents:
diff changeset
594 cell_count = MultiBranchData::compute_cell_count(stream);
a61af66fc99e Initial load
duke
parents:
diff changeset
595 tag = DataLayout::multi_branch_data_tag;
a61af66fc99e Initial load
duke
parents:
diff changeset
596 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
597 }
a61af66fc99e Initial load
duke
parents:
diff changeset
598 assert(tag == DataLayout::multi_branch_data_tag ||
a61af66fc99e Initial load
duke
parents:
diff changeset
599 cell_count == bytecode_cell_count(c), "cell counts must agree");
a61af66fc99e Initial load
duke
parents:
diff changeset
600 if (cell_count >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
601 assert(tag != DataLayout::no_tag, "bad tag");
a61af66fc99e Initial load
duke
parents:
diff changeset
602 assert(bytecode_has_profile(c), "agree w/ BHP");
a61af66fc99e Initial load
duke
parents:
diff changeset
603 data_layout->initialize(tag, stream->bci(), cell_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
604 return DataLayout::compute_size_in_bytes(cell_count);
a61af66fc99e Initial load
duke
parents:
diff changeset
605 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
606 assert(!bytecode_has_profile(c), "agree w/ !BHP");
a61af66fc99e Initial load
duke
parents:
diff changeset
607 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
608 }
8860
46f6f063b272 7153771: array bound check elimination for c1
roland
parents: 8712
diff changeset
609 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
610 }
a61af66fc99e Initial load
duke
parents:
diff changeset
611
a61af66fc99e Initial load
duke
parents:
diff changeset
612 // Get the data at an arbitrary (sort of) data index.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
613 ProfileData* MethodData::data_at(int data_index) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
614 if (out_of_bounds(data_index)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
615 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
616 }
a61af66fc99e Initial load
duke
parents:
diff changeset
617 DataLayout* data_layout = data_layout_at(data_index);
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 844
diff changeset
618 return data_layout->data_in();
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 844
diff changeset
619 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
620
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 844
diff changeset
621 ProfileData* DataLayout::data_in() {
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 844
diff changeset
622 switch (tag()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
623 case DataLayout::no_tag:
a61af66fc99e Initial load
duke
parents:
diff changeset
624 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
625 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
626 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
627 case DataLayout::bit_data_tag:
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 844
diff changeset
628 return new BitData(this);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
629 case DataLayout::counter_data_tag:
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 844
diff changeset
630 return new CounterData(this);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
631 case DataLayout::jump_data_tag:
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 844
diff changeset
632 return new JumpData(this);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
633 case DataLayout::receiver_type_data_tag:
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 844
diff changeset
634 return new ReceiverTypeData(this);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
635 case DataLayout::virtual_call_data_tag:
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 844
diff changeset
636 return new VirtualCallData(this);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
637 case DataLayout::ret_data_tag:
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 844
diff changeset
638 return new RetData(this);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
639 case DataLayout::branch_data_tag:
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 844
diff changeset
640 return new BranchData(this);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
641 case DataLayout::multi_branch_data_tag:
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 844
diff changeset
642 return new MultiBranchData(this);
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
643 case DataLayout::arg_info_data_tag:
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 844
diff changeset
644 return new ArgInfoData(this);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
645 };
a61af66fc99e Initial load
duke
parents:
diff changeset
646 }
a61af66fc99e Initial load
duke
parents:
diff changeset
647
a61af66fc99e Initial load
duke
parents:
diff changeset
648 // Iteration over data.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
649 ProfileData* MethodData::next_data(ProfileData* current) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
650 int current_index = dp_to_di(current->dp());
a61af66fc99e Initial load
duke
parents:
diff changeset
651 int next_index = current_index + current->size_in_bytes();
a61af66fc99e Initial load
duke
parents:
diff changeset
652 ProfileData* next = data_at(next_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
653 return next;
a61af66fc99e Initial load
duke
parents:
diff changeset
654 }
a61af66fc99e Initial load
duke
parents:
diff changeset
655
a61af66fc99e Initial load
duke
parents:
diff changeset
656 // Give each of the data entries a chance to perform specific
a61af66fc99e Initial load
duke
parents:
diff changeset
657 // data initialization.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
658 void MethodData::post_initialize(BytecodeStream* stream) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
659 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
660 ProfileData* data;
a61af66fc99e Initial load
duke
parents:
diff changeset
661 for (data = first_data(); is_valid(data); data = next_data(data)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
662 stream->set_start(data->bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
663 stream->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
664 data->post_initialize(stream, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
665 }
a61af66fc99e Initial load
duke
parents:
diff changeset
666 }
a61af66fc99e Initial load
duke
parents:
diff changeset
667
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
668 // Initialize the MethodData* corresponding to a given method.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
669 MethodData::MethodData(methodHandle method, int size, TRAPS) {
8611
6c4db417385a added API to reset the profiling information for a method
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8125
diff changeset
670 // Set the method back-pointer.
6c4db417385a added API to reset the profiling information for a method
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8125
diff changeset
671 _method = method();
6c4db417385a added API to reset the profiling information for a method
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8125
diff changeset
672 initialize();
6c4db417385a added API to reset the profiling information for a method
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8125
diff changeset
673 }
6c4db417385a added API to reset the profiling information for a method
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8125
diff changeset
674
6c4db417385a added API to reset the profiling information for a method
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8125
diff changeset
675 void MethodData::initialize() {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
676 No_Safepoint_Verifier no_safepoint; // init function atomic wrt GC
0
a61af66fc99e Initial load
duke
parents:
diff changeset
677 ResourceMark rm;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
678
9080
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8860
diff changeset
679 init();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
680 set_creation_mileage(mileage_of(method()));
a61af66fc99e Initial load
duke
parents:
diff changeset
681
a61af66fc99e Initial load
duke
parents:
diff changeset
682 // Go through the bytecodes and allocate and initialize the
a61af66fc99e Initial load
duke
parents:
diff changeset
683 // corresponding data cells.
a61af66fc99e Initial load
duke
parents:
diff changeset
684 int data_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
685 int empty_bc_count = 0; // number of bytecodes lacking data
8712
3efdfd6ddbf2 8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents: 7956
diff changeset
686 _data[0] = 0; // apparently not set below.
8611
6c4db417385a added API to reset the profiling information for a method
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8125
diff changeset
687 BytecodeStream stream(method());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
688 Bytecodes::Code c;
a61af66fc99e Initial load
duke
parents:
diff changeset
689 while ((c = stream.next()) >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
690 int size_in_bytes = initialize_data(&stream, data_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
691 data_size += size_in_bytes;
4568
8e1d9c27989a better allocation of methodData's extraData so that exceptions and deoptimizations can be recorded more accurately
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4439
diff changeset
692
8e1d9c27989a better allocation of methodData's extraData so that exceptions and deoptimizations can be recorded more accurately
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4439
diff changeset
693 if (is_empty_data(size_in_bytes, c)) empty_bc_count++;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
694 }
a61af66fc99e Initial load
duke
parents:
diff changeset
695 _data_size = data_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
696 int object_size = in_bytes(data_offset()) + data_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
697
a61af66fc99e Initial load
duke
parents:
diff changeset
698 // Add some extra DataLayout cells (at least one) to track stray traps.
a61af66fc99e Initial load
duke
parents:
diff changeset
699 int extra_data_count = compute_extra_data_count(data_size, empty_bc_count);
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
700 int extra_size = extra_data_count * DataLayout::compute_size_in_bytes(0);
4568
8e1d9c27989a better allocation of methodData's extraData so that exceptions and deoptimizations can be recorded more accurately
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4439
diff changeset
701 object_size += extra_size;
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
702
8611
6c4db417385a added API to reset the profiling information for a method
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8125
diff changeset
703 Copy::zero_to_bytes((HeapWord*) extra_data_base(), extra_size);
6c4db417385a added API to reset the profiling information for a method
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8125
diff changeset
704
7154
5d0bb7d52783 changes to support Graal co-existing with the other HotSpot compiler(s) and being used for explicit compilation requests and code installation via the Graal API
Doug Simon <doug.simon@oracle.com>
parents: 6948
diff changeset
705 #ifndef GRAALVM
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
706 // Add a cell to record information about modified arguments.
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
707 // Set up _args_modified array after traps cells so that
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
708 // the code for traps cells works.
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
709 DataLayout *dp = data_layout_at(data_size + extra_size);
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
710
8615
91c79e13b9cf minor C1/C2 fix
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8611
diff changeset
711 int arg_size = method()->size_of_parameters();
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
712 dp->initialize(DataLayout::arg_info_data_tag, 0, arg_size+1);
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
713
4568
8e1d9c27989a better allocation of methodData's extraData so that exceptions and deoptimizations can be recorded more accurately
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4439
diff changeset
714 object_size += DataLayout::compute_size_in_bytes(arg_size+1);
8e1d9c27989a better allocation of methodData's extraData so that exceptions and deoptimizations can be recorded more accurately
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4439
diff changeset
715 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
716
a61af66fc99e Initial load
duke
parents:
diff changeset
717 // Set an initial hint. Don't use set_hint_di() because
a61af66fc99e Initial load
duke
parents:
diff changeset
718 // first_di() may be out of bounds if data_size is 0.
a61af66fc99e Initial load
duke
parents:
diff changeset
719 // In that situation, _hint_di is never used, but at
a61af66fc99e Initial load
duke
parents:
diff changeset
720 // least well-defined.
a61af66fc99e Initial load
duke
parents:
diff changeset
721 _hint_di = first_di();
a61af66fc99e Initial load
duke
parents:
diff changeset
722
a61af66fc99e Initial load
duke
parents:
diff changeset
723 post_initialize(&stream);
a61af66fc99e Initial load
duke
parents:
diff changeset
724
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
725 set_size(object_size);
9080
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8860
diff changeset
726 }
8712
3efdfd6ddbf2 8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents: 7956
diff changeset
727
9080
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8860
diff changeset
728 void MethodData::init() {
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8860
diff changeset
729 _invocation_counter.init();
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8860
diff changeset
730 _backedge_counter.init();
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8860
diff changeset
731 _invocation_counter_start = 0;
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8860
diff changeset
732 _backedge_counter_start = 0;
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8860
diff changeset
733 _num_loops = 0;
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8860
diff changeset
734 _num_blocks = 0;
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8860
diff changeset
735 _highest_comp_level = 0;
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8860
diff changeset
736 _highest_osr_comp_level = 0;
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8860
diff changeset
737 _would_profile = true;
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8860
diff changeset
738
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8860
diff changeset
739 // Initialize flags and trap history.
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8860
diff changeset
740 _nof_decompiles = 0;
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8860
diff changeset
741 _nof_overflow_recompiles = 0;
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8860
diff changeset
742 _nof_overflow_traps = 0;
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8860
diff changeset
743 clear_escape_info();
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8860
diff changeset
744 assert(sizeof(_trap_hist) % sizeof(HeapWord) == 0, "align");
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8860
diff changeset
745 Copy::zero_to_words((HeapWord*) &_trap_hist,
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8860
diff changeset
746 sizeof(_trap_hist) / sizeof(HeapWord));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
747 }
a61af66fc99e Initial load
duke
parents:
diff changeset
748
6948
e522a00b91aa Merge with http://hg.openjdk.java.net/hsx/hsx25/hotspot/ after NPG - C++ build works
Doug Simon <doug.simon@oracle.com>
parents: 5150 6725
diff changeset
749 bool MethodData::is_empty_data(int size_in_bytes, Bytecodes::Code code) {
8616
d343737786fe changed profiling of exceptions so that the ExceptionSeen flag also works without GRAALVM
Christian Haeubl <haeubl@ssw.jku.at>
parents: 8615
diff changeset
750 #ifdef GRAAL
4568
8e1d9c27989a better allocation of methodData's extraData so that exceptions and deoptimizations can be recorded more accurately
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4439
diff changeset
751 return size_in_bytes == 0 && Bytecodes::can_trap(code);
8e1d9c27989a better allocation of methodData's extraData so that exceptions and deoptimizations can be recorded more accurately
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4439
diff changeset
752 #else
8e1d9c27989a better allocation of methodData's extraData so that exceptions and deoptimizations can be recorded more accurately
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4439
diff changeset
753 return size_in_bytes == 0;
8e1d9c27989a better allocation of methodData's extraData so that exceptions and deoptimizations can be recorded more accurately
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4439
diff changeset
754 #endif
8e1d9c27989a better allocation of methodData's extraData so that exceptions and deoptimizations can be recorded more accurately
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4439
diff changeset
755 }
8e1d9c27989a better allocation of methodData's extraData so that exceptions and deoptimizations can be recorded more accurately
Christian Haeubl <christian.haeubl@oracle.com>
parents: 4439
diff changeset
756
0
a61af66fc99e Initial load
duke
parents:
diff changeset
757 // Get a measure of how much mileage the method has on it.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
758 int MethodData::mileage_of(Method* method) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
759 int mileage = 0;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
760 if (TieredCompilation) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
761 mileage = MAX2(method->invocation_count(), method->backedge_count());
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
762 } else {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
763 int iic = method->interpreter_invocation_count();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
764 if (mileage < iic) mileage = iic;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
765 InvocationCounter* ic = method->invocation_counter();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
766 InvocationCounter* bc = method->backedge_counter();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
767 int icval = ic->count();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
768 if (ic->carry()) icval += CompileThreshold;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
769 if (mileage < icval) mileage = icval;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
770 int bcval = bc->count();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
771 if (bc->carry()) bcval += CompileThreshold;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
772 if (mileage < bcval) mileage = bcval;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
773 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
774 return mileage;
a61af66fc99e Initial load
duke
parents:
diff changeset
775 }
a61af66fc99e Initial load
duke
parents:
diff changeset
776
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
777 bool MethodData::is_mature() const {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
778 return CompilationPolicy::policy()->is_mature(_method);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
779 }
a61af66fc99e Initial load
duke
parents:
diff changeset
780
a61af66fc99e Initial load
duke
parents:
diff changeset
781 // Translate a bci to its corresponding data index (di).
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
782 address MethodData::bci_to_dp(int bci) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
783 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
784 ProfileData* data = data_before(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
785 ProfileData* prev = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
786 for ( ; is_valid(data); data = next_data(data)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
787 if (data->bci() >= bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
788 if (data->bci() == bci) set_hint_di(dp_to_di(data->dp()));
a61af66fc99e Initial load
duke
parents:
diff changeset
789 else if (prev != NULL) set_hint_di(dp_to_di(prev->dp()));
a61af66fc99e Initial load
duke
parents:
diff changeset
790 return data->dp();
a61af66fc99e Initial load
duke
parents:
diff changeset
791 }
a61af66fc99e Initial load
duke
parents:
diff changeset
792 prev = data;
a61af66fc99e Initial load
duke
parents:
diff changeset
793 }
a61af66fc99e Initial load
duke
parents:
diff changeset
794 return (address)limit_data_position();
a61af66fc99e Initial load
duke
parents:
diff changeset
795 }
a61af66fc99e Initial load
duke
parents:
diff changeset
796
a61af66fc99e Initial load
duke
parents:
diff changeset
797 // Translate a bci to its corresponding data, or NULL.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
798 ProfileData* MethodData::bci_to_data(int bci) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
799 ProfileData* data = data_before(bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
800 for ( ; is_valid(data); data = next_data(data)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
801 if (data->bci() == bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
802 set_hint_di(dp_to_di(data->dp()));
a61af66fc99e Initial load
duke
parents:
diff changeset
803 return data;
a61af66fc99e Initial load
duke
parents:
diff changeset
804 } else if (data->bci() > bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
805 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
806 }
a61af66fc99e Initial load
duke
parents:
diff changeset
807 }
a61af66fc99e Initial load
duke
parents:
diff changeset
808 return bci_to_extra_data(bci, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
809 }
a61af66fc99e Initial load
duke
parents:
diff changeset
810
a61af66fc99e Initial load
duke
parents:
diff changeset
811 // Translate a bci to its corresponding extra data, or NULL.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
812 ProfileData* MethodData::bci_to_extra_data(int bci, bool create_if_missing) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
813 DataLayout* dp = extra_data_base();
a61af66fc99e Initial load
duke
parents:
diff changeset
814 DataLayout* end = extra_data_limit();
a61af66fc99e Initial load
duke
parents:
diff changeset
815 DataLayout* avail = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
816 for (; dp < end; dp = next_extra(dp)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
817 // No need for "OrderAccess::load_acquire" ops,
a61af66fc99e Initial load
duke
parents:
diff changeset
818 // since the data structure is monotonic.
a61af66fc99e Initial load
duke
parents:
diff changeset
819 if (dp->tag() == DataLayout::no_tag) break;
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
820 if (dp->tag() == DataLayout::arg_info_data_tag) {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
821 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
822 break;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
823 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
824 if (dp->bci() == bci) {
a61af66fc99e Initial load
duke
parents:
diff changeset
825 assert(dp->tag() == DataLayout::bit_data_tag, "sane");
a61af66fc99e Initial load
duke
parents:
diff changeset
826 return new BitData(dp);
a61af66fc99e Initial load
duke
parents:
diff changeset
827 }
a61af66fc99e Initial load
duke
parents:
diff changeset
828 }
a61af66fc99e Initial load
duke
parents:
diff changeset
829 if (create_if_missing && dp < end) {
a61af66fc99e Initial load
duke
parents:
diff changeset
830 // Allocate this one. There is no mutual exclusion,
a61af66fc99e Initial load
duke
parents:
diff changeset
831 // so two threads could allocate different BCIs to the
a61af66fc99e Initial load
duke
parents:
diff changeset
832 // same data layout. This means these extra data
a61af66fc99e Initial load
duke
parents:
diff changeset
833 // records, like most other MDO contents, must not be
a61af66fc99e Initial load
duke
parents:
diff changeset
834 // trusted too much.
a61af66fc99e Initial load
duke
parents:
diff changeset
835 DataLayout temp;
a61af66fc99e Initial load
duke
parents:
diff changeset
836 temp.initialize(DataLayout::bit_data_tag, bci, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
837 dp->release_set_header(temp.header());
a61af66fc99e Initial load
duke
parents:
diff changeset
838 assert(dp->tag() == DataLayout::bit_data_tag, "sane");
a61af66fc99e Initial load
duke
parents:
diff changeset
839 //NO: assert(dp->bci() == bci, "no concurrent allocation");
a61af66fc99e Initial load
duke
parents:
diff changeset
840 return new BitData(dp);
a61af66fc99e Initial load
duke
parents:
diff changeset
841 }
a61af66fc99e Initial load
duke
parents:
diff changeset
842 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
843 }
a61af66fc99e Initial load
duke
parents:
diff changeset
844
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
845 ArgInfoData *MethodData::arg_info() {
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
846 DataLayout* dp = extra_data_base();
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
847 DataLayout* end = extra_data_limit();
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
848 for (; dp < end; dp = next_extra(dp)) {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
849 if (dp->tag() == DataLayout::arg_info_data_tag)
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
850 return new ArgInfoData(dp);
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
851 }
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
852 return NULL;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
853 }
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
854
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
855 // Printing
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
856
0
a61af66fc99e Initial load
duke
parents:
diff changeset
857 #ifndef PRODUCT
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
858
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
859 void MethodData::print_on(outputStream* st) const {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
860 assert(is_methodData(), "should be method data");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
861 st->print("method data for ");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
862 method()->print_value_on(st);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
863 st->cr();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
864 print_data_on(st);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
865 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
866
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
867 #endif //PRODUCT
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
868
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
869 void MethodData::print_value_on(outputStream* st) const {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
870 assert(is_methodData(), "should be method data");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
871 st->print("method data for ");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
872 method()->print_value_on(st);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
873 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
874
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
875 #ifndef PRODUCT
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
876 void MethodData::print_data_on(outputStream* st) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
877 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
878 ProfileData* data = first_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
879 for ( ; is_valid(data); data = next_data(data)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
880 st->print("%d", dp_to_di(data->dp()));
a61af66fc99e Initial load
duke
parents:
diff changeset
881 st->fill_to(6);
a61af66fc99e Initial load
duke
parents:
diff changeset
882 data->print_data_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
883 }
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
884 st->print_cr("--- Extra data:");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
885 DataLayout* dp = extra_data_base();
a61af66fc99e Initial load
duke
parents:
diff changeset
886 DataLayout* end = extra_data_limit();
a61af66fc99e Initial load
duke
parents:
diff changeset
887 for (; dp < end; dp = next_extra(dp)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
888 // No need for "OrderAccess::load_acquire" ops,
a61af66fc99e Initial load
duke
parents:
diff changeset
889 // since the data structure is monotonic.
45
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
890 if (dp->tag() == DataLayout::no_tag) continue;
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
891 if (dp->tag() == DataLayout::bit_data_tag) {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
892 data = new BitData(dp);
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
893 } else {
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
894 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
895 data = new ArgInfoData(dp);
48a3fa21394b 6667615: (Escape Analysis) extend MDO to cache arguments escape state
kvn
parents: 0
diff changeset
896 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
897 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
898 st->print("%d", dp_to_di(data->dp()));
a61af66fc99e Initial load
duke
parents:
diff changeset
899 st->fill_to(6);
a61af66fc99e Initial load
duke
parents:
diff changeset
900 data->print_data_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
901 }
a61af66fc99e Initial load
duke
parents:
diff changeset
902 }
a61af66fc99e Initial load
duke
parents:
diff changeset
903 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
904
7956
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 6725
diff changeset
905 #if INCLUDE_SERVICES
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 6725
diff changeset
906 // Size Statistics
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 6725
diff changeset
907 void MethodData::collect_statistics(KlassSizeStats *sz) const {
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 6725
diff changeset
908 int n = sz->count(this);
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 6725
diff changeset
909 sz->_method_data_bytes += n;
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 6725
diff changeset
910 sz->_method_all_bytes += n;
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 6725
diff changeset
911 sz->_rw_bytes += n;
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 6725
diff changeset
912 }
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 6725
diff changeset
913 #endif // INCLUDE_SERVICES
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
914
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
915 // Verification
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
916
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
917 void MethodData::verify_on(outputStream* st) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
918 guarantee(is_methodData(), "object must be method data");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
919 // guarantee(m->is_perm(), "should be in permspace");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
920 this->verify_data_on(st);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
921 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
922
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 2264
diff changeset
923 void MethodData::verify_data_on(outputStream* st) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
924 NEEDS_CLEANUP;
a61af66fc99e Initial load
duke
parents:
diff changeset
925 // not yet implemented.
a61af66fc99e Initial load
duke
parents:
diff changeset
926 }