annotate src/share/vm/code/dependencies.cpp @ 6972:bd7a7ce2e264

6830717: replay of compilations would help with debugging Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method. Reviewed-by: kvn, twisti, sspitsyn Contributed-by: yumin.qi@oracle.com
author minqi
date Mon, 12 Nov 2012 14:03:53 -0800
parents 18fb7da42534
children 80e866b1d053
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
5998
49036505ab5f 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 4772
diff changeset
2 * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1206
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1206
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: 1206
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: 1552
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #include "ci/ciArrayKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27 #include "ci/ciEnv.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "ci/ciKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "ci/ciMethod.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30 #include "code/dependencies.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
31 #include "compiler/compileLog.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
32 #include "oops/oop.inline.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
33 #include "runtime/handles.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
34 #include "runtime/handles.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
35 #include "utilities/copy.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 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
39 static bool must_be_in_vm() {
a61af66fc99e Initial load
duke
parents:
diff changeset
40 Thread* thread = Thread::current();
a61af66fc99e Initial load
duke
parents:
diff changeset
41 if (thread->is_Java_thread())
a61af66fc99e Initial load
duke
parents:
diff changeset
42 return ((JavaThread*)thread)->thread_state() == _thread_in_vm;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 else
a61af66fc99e Initial load
duke
parents:
diff changeset
44 return true; //something like this: thread->is_VM_thread();
a61af66fc99e Initial load
duke
parents:
diff changeset
45 }
a61af66fc99e Initial load
duke
parents:
diff changeset
46 #endif //ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
47
a61af66fc99e Initial load
duke
parents:
diff changeset
48 void Dependencies::initialize(ciEnv* env) {
a61af66fc99e Initial load
duke
parents:
diff changeset
49 Arena* arena = env->arena();
a61af66fc99e Initial load
duke
parents:
diff changeset
50 _oop_recorder = env->oop_recorder();
a61af66fc99e Initial load
duke
parents:
diff changeset
51 _log = env->log();
a61af66fc99e Initial load
duke
parents:
diff changeset
52 _dep_seen = new(arena) GrowableArray<int>(arena, 500, 0, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
53 DEBUG_ONLY(_deps[end_marker] = NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
54 for (int i = (int)FIRST_TYPE; i < (int)TYPE_LIMIT; i++) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
55 _deps[i] = new(arena) GrowableArray<ciBaseObject*>(arena, 10, 0, 0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
56 }
a61af66fc99e Initial load
duke
parents:
diff changeset
57 _content_bytes = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
58 _size_in_bytes = (size_t)-1;
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 assert(TYPE_LIMIT <= (1<<LG2_TYPE_LIMIT), "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
61 }
a61af66fc99e Initial load
duke
parents:
diff changeset
62
a61af66fc99e Initial load
duke
parents:
diff changeset
63 void Dependencies::assert_evol_method(ciMethod* m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
64 assert_common_1(evol_method, m);
a61af66fc99e Initial load
duke
parents:
diff changeset
65 }
a61af66fc99e Initial load
duke
parents:
diff changeset
66
a61af66fc99e Initial load
duke
parents:
diff changeset
67 void Dependencies::assert_leaf_type(ciKlass* ctxk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
68 if (ctxk->is_array_klass()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // As a special case, support this assertion on an array type,
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // which reduces to an assertion on its element type.
a61af66fc99e Initial load
duke
parents:
diff changeset
71 // Note that this cannot be done with assertions that
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // relate to concreteness or abstractness.
a61af66fc99e Initial load
duke
parents:
diff changeset
73 ciType* elemt = ctxk->as_array_klass()->base_element_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
74 if (!elemt->is_instance_klass()) return; // Ex: int[][]
a61af66fc99e Initial load
duke
parents:
diff changeset
75 ctxk = elemt->as_instance_klass();
a61af66fc99e Initial load
duke
parents:
diff changeset
76 //if (ctxk->is_final()) return; // Ex: String[][]
a61af66fc99e Initial load
duke
parents:
diff changeset
77 }
a61af66fc99e Initial load
duke
parents:
diff changeset
78 check_ctxk(ctxk);
a61af66fc99e Initial load
duke
parents:
diff changeset
79 assert_common_1(leaf_type, ctxk);
a61af66fc99e Initial load
duke
parents:
diff changeset
80 }
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 void Dependencies::assert_abstract_with_unique_concrete_subtype(ciKlass* ctxk, ciKlass* conck) {
a61af66fc99e Initial load
duke
parents:
diff changeset
83 check_ctxk_abstract(ctxk);
a61af66fc99e Initial load
duke
parents:
diff changeset
84 assert_common_2(abstract_with_unique_concrete_subtype, ctxk, conck);
a61af66fc99e Initial load
duke
parents:
diff changeset
85 }
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 void Dependencies::assert_abstract_with_no_concrete_subtype(ciKlass* ctxk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
88 check_ctxk_abstract(ctxk);
a61af66fc99e Initial load
duke
parents:
diff changeset
89 assert_common_1(abstract_with_no_concrete_subtype, ctxk);
a61af66fc99e Initial load
duke
parents:
diff changeset
90 }
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 void Dependencies::assert_concrete_with_no_concrete_subtype(ciKlass* ctxk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
93 check_ctxk_concrete(ctxk);
a61af66fc99e Initial load
duke
parents:
diff changeset
94 assert_common_1(concrete_with_no_concrete_subtype, ctxk);
a61af66fc99e Initial load
duke
parents:
diff changeset
95 }
a61af66fc99e Initial load
duke
parents:
diff changeset
96
a61af66fc99e Initial load
duke
parents:
diff changeset
97 void Dependencies::assert_unique_concrete_method(ciKlass* ctxk, ciMethod* uniqm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
98 check_ctxk(ctxk);
a61af66fc99e Initial load
duke
parents:
diff changeset
99 assert_common_2(unique_concrete_method, ctxk, uniqm);
a61af66fc99e Initial load
duke
parents:
diff changeset
100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 void Dependencies::assert_abstract_with_exclusive_concrete_subtypes(ciKlass* ctxk, ciKlass* k1, ciKlass* k2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
103 check_ctxk(ctxk);
a61af66fc99e Initial load
duke
parents:
diff changeset
104 assert_common_3(abstract_with_exclusive_concrete_subtypes_2, ctxk, k1, k2);
a61af66fc99e Initial load
duke
parents:
diff changeset
105 }
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107 void Dependencies::assert_exclusive_concrete_methods(ciKlass* ctxk, ciMethod* m1, ciMethod* m2) {
a61af66fc99e Initial load
duke
parents:
diff changeset
108 check_ctxk(ctxk);
a61af66fc99e Initial load
duke
parents:
diff changeset
109 assert_common_3(exclusive_concrete_methods_2, ctxk, m1, m2);
a61af66fc99e Initial load
duke
parents:
diff changeset
110 }
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112 void Dependencies::assert_has_no_finalizable_subclasses(ciKlass* ctxk) {
a61af66fc99e Initial load
duke
parents:
diff changeset
113 check_ctxk(ctxk);
a61af66fc99e Initial load
duke
parents:
diff changeset
114 assert_common_1(no_finalizable_subclasses, ctxk);
a61af66fc99e Initial load
duke
parents:
diff changeset
115 }
a61af66fc99e Initial load
duke
parents:
diff changeset
116
3894
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
117 void Dependencies::assert_call_site_target_value(ciCallSite* call_site, ciMethodHandle* method_handle) {
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
118 check_ctxk(call_site->klass());
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
119 assert_common_2(call_site_target_value, call_site, method_handle);
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
120 }
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
121
0
a61af66fc99e Initial load
duke
parents:
diff changeset
122 // Helper function. If we are adding a new dep. under ctxk2,
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // try to find an old dep. under a broader* ctxk1. If there is
a61af66fc99e Initial load
duke
parents:
diff changeset
124 //
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
125 bool Dependencies::maybe_merge_ctxk(GrowableArray<ciBaseObject*>* deps,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
126 int ctxk_i, ciKlass* ctxk2) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
127 ciKlass* ctxk1 = deps->at(ctxk_i)->as_metadata()->as_klass();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
128 if (ctxk2->is_subtype_of(ctxk1)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
129 return true; // success, and no need to change
a61af66fc99e Initial load
duke
parents:
diff changeset
130 } else if (ctxk1->is_subtype_of(ctxk2)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // new context class fully subsumes previous one
a61af66fc99e Initial load
duke
parents:
diff changeset
132 deps->at_put(ctxk_i, ctxk2);
a61af66fc99e Initial load
duke
parents:
diff changeset
133 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
135 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
136 }
a61af66fc99e Initial load
duke
parents:
diff changeset
137 }
a61af66fc99e Initial load
duke
parents:
diff changeset
138
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
139 void Dependencies::assert_common_1(DepType dept, ciBaseObject* x) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
140 assert(dep_args(dept) == 1, "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
141 log_dependency(dept, x);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
142 GrowableArray<ciBaseObject*>* deps = _deps[dept];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // see if the same (or a similar) dep is already recorded
a61af66fc99e Initial load
duke
parents:
diff changeset
145 if (note_dep_seen(dept, x)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
146 assert(deps->find(x) >= 0, "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
147 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
148 deps->append(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
149 }
a61af66fc99e Initial load
duke
parents:
diff changeset
150 }
a61af66fc99e Initial load
duke
parents:
diff changeset
151
3894
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
152 void Dependencies::assert_common_2(DepType dept,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
153 ciBaseObject* x0, ciBaseObject* x1) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
154 assert(dep_args(dept) == 2, "sanity");
3894
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
155 log_dependency(dept, x0, x1);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
156 GrowableArray<ciBaseObject*>* deps = _deps[dept];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 // see if the same (or a similar) dep is already recorded
3894
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
159 bool has_ctxk = has_explicit_context_arg(dept);
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
160 if (has_ctxk) {
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
161 assert(dep_context_arg(dept) == 0, "sanity");
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
162 if (note_dep_seen(dept, x1)) {
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
163 // look in this bucket for redundant assertions
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
164 const int stride = 2;
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
165 for (int i = deps->length(); (i -= stride) >= 0; ) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
166 ciBaseObject* y1 = deps->at(i+1);
3894
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
167 if (x1 == y1) { // same subject; check the context
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
168 if (maybe_merge_ctxk(deps, i+0, x0->as_metadata()->as_klass())) {
3894
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
169 return;
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
170 }
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
171 }
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
172 }
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
173 }
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
174 } else {
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
175 assert(dep_implicit_context_arg(dept) == 0, "sanity");
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
176 if (note_dep_seen(dept, x0) && note_dep_seen(dept, x1)) {
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
177 // look in this bucket for redundant assertions
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
178 const int stride = 2;
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
179 for (int i = deps->length(); (i -= stride) >= 0; ) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
180 ciBaseObject* y0 = deps->at(i+0);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
181 ciBaseObject* y1 = deps->at(i+1);
3894
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
182 if (x0 == y0 && x1 == y1) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
183 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
184 }
a61af66fc99e Initial load
duke
parents:
diff changeset
185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
186 }
a61af66fc99e Initial load
duke
parents:
diff changeset
187 }
a61af66fc99e Initial load
duke
parents:
diff changeset
188
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // append the assertion in the correct bucket:
3894
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
190 deps->append(x0);
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
191 deps->append(x1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
192 }
a61af66fc99e Initial load
duke
parents:
diff changeset
193
3894
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
194 void Dependencies::assert_common_3(DepType dept,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
195 ciKlass* ctxk, ciBaseObject* x, ciBaseObject* x2) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
196 assert(dep_context_arg(dept) == 0, "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
197 assert(dep_args(dept) == 3, "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
198 log_dependency(dept, ctxk, x, x2);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
199 GrowableArray<ciBaseObject*>* deps = _deps[dept];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // try to normalize an unordered pair:
a61af66fc99e Initial load
duke
parents:
diff changeset
202 bool swap = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
203 switch (dept) {
a61af66fc99e Initial load
duke
parents:
diff changeset
204 case abstract_with_exclusive_concrete_subtypes_2:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
205 swap = (x->ident() > x2->ident() && x->as_metadata()->as_klass() != ctxk);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
206 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
207 case exclusive_concrete_methods_2:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
208 swap = (x->ident() > x2->ident() && x->as_metadata()->as_method()->holder() != ctxk);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
209 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
210 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
211 if (swap) { ciBaseObject* t = x; x = x2; x2 = t; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // see if the same (or a similar) dep is already recorded
a61af66fc99e Initial load
duke
parents:
diff changeset
214 if (note_dep_seen(dept, x) && note_dep_seen(dept, x2)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // look in this bucket for redundant assertions
a61af66fc99e Initial load
duke
parents:
diff changeset
216 const int stride = 3;
a61af66fc99e Initial load
duke
parents:
diff changeset
217 for (int i = deps->length(); (i -= stride) >= 0; ) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
218 ciBaseObject* y = deps->at(i+1);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
219 ciBaseObject* y2 = deps->at(i+2);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
220 if (x == y && x2 == y2) { // same subjects; check the context
a61af66fc99e Initial load
duke
parents:
diff changeset
221 if (maybe_merge_ctxk(deps, i+0, ctxk)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
222 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
223 }
a61af66fc99e Initial load
duke
parents:
diff changeset
224 }
a61af66fc99e Initial load
duke
parents:
diff changeset
225 }
a61af66fc99e Initial load
duke
parents:
diff changeset
226 }
a61af66fc99e Initial load
duke
parents:
diff changeset
227 // append the assertion in the correct bucket:
a61af66fc99e Initial load
duke
parents:
diff changeset
228 deps->append(ctxk);
a61af66fc99e Initial load
duke
parents:
diff changeset
229 deps->append(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
230 deps->append(x2);
a61af66fc99e Initial load
duke
parents:
diff changeset
231 }
a61af66fc99e Initial load
duke
parents:
diff changeset
232
a61af66fc99e Initial load
duke
parents:
diff changeset
233 /// Support for encoding dependencies into an nmethod:
a61af66fc99e Initial load
duke
parents:
diff changeset
234
a61af66fc99e Initial load
duke
parents:
diff changeset
235 void Dependencies::copy_to(nmethod* nm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
236 address beg = nm->dependencies_begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
237 address end = nm->dependencies_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
238 guarantee(end - beg >= (ptrdiff_t) size_in_bytes(), "bad sizing");
a61af66fc99e Initial load
duke
parents:
diff changeset
239 Copy::disjoint_words((HeapWord*) content_bytes(),
a61af66fc99e Initial load
duke
parents:
diff changeset
240 (HeapWord*) beg,
a61af66fc99e Initial load
duke
parents:
diff changeset
241 size_in_bytes() / sizeof(HeapWord));
a61af66fc99e Initial load
duke
parents:
diff changeset
242 assert(size_in_bytes() % sizeof(HeapWord) == 0, "copy by words");
a61af66fc99e Initial load
duke
parents:
diff changeset
243 }
a61af66fc99e Initial load
duke
parents:
diff changeset
244
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
245 static int sort_dep(ciBaseObject** p1, ciBaseObject** p2, int narg) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
246 for (int i = 0; i < narg; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
247 int diff = p1[i]->ident() - p2[i]->ident();
a61af66fc99e Initial load
duke
parents:
diff changeset
248 if (diff != 0) return diff;
a61af66fc99e Initial load
duke
parents:
diff changeset
249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
250 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
251 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
252 static int sort_dep_arg_1(ciBaseObject** p1, ciBaseObject** p2)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
253 { return sort_dep(p1, p2, 1); }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
254 static int sort_dep_arg_2(ciBaseObject** p1, ciBaseObject** p2)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
255 { return sort_dep(p1, p2, 2); }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
256 static int sort_dep_arg_3(ciBaseObject** p1, ciBaseObject** p2)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
257 { return sort_dep(p1, p2, 3); }
a61af66fc99e Initial load
duke
parents:
diff changeset
258
a61af66fc99e Initial load
duke
parents:
diff changeset
259 void Dependencies::sort_all_deps() {
a61af66fc99e Initial load
duke
parents:
diff changeset
260 for (int deptv = (int)FIRST_TYPE; deptv < (int)TYPE_LIMIT; deptv++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
261 DepType dept = (DepType)deptv;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
262 GrowableArray<ciBaseObject*>* deps = _deps[dept];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
263 if (deps->length() <= 1) continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
264 switch (dep_args(dept)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
265 case 1: deps->sort(sort_dep_arg_1, 1); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
266 case 2: deps->sort(sort_dep_arg_2, 2); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
267 case 3: deps->sort(sort_dep_arg_3, 3); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
268 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273 size_t Dependencies::estimate_size_in_bytes() {
a61af66fc99e Initial load
duke
parents:
diff changeset
274 size_t est_size = 100;
a61af66fc99e Initial load
duke
parents:
diff changeset
275 for (int deptv = (int)FIRST_TYPE; deptv < (int)TYPE_LIMIT; deptv++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
276 DepType dept = (DepType)deptv;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
277 GrowableArray<ciBaseObject*>* deps = _deps[dept];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
278 est_size += deps->length()*2; // tags and argument(s)
a61af66fc99e Initial load
duke
parents:
diff changeset
279 }
a61af66fc99e Initial load
duke
parents:
diff changeset
280 return est_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
281 }
a61af66fc99e Initial load
duke
parents:
diff changeset
282
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
283 ciKlass* Dependencies::ctxk_encoded_as_null(DepType dept, ciBaseObject* x) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
284 switch (dept) {
a61af66fc99e Initial load
duke
parents:
diff changeset
285 case abstract_with_exclusive_concrete_subtypes_2:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
286 return x->as_metadata()->as_klass();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
287 case unique_concrete_method:
a61af66fc99e Initial load
duke
parents:
diff changeset
288 case exclusive_concrete_methods_2:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
289 return x->as_metadata()->as_method()->holder();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
290 }
a61af66fc99e Initial load
duke
parents:
diff changeset
291 return NULL; // let NULL be NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
292 }
a61af66fc99e Initial load
duke
parents:
diff changeset
293
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
294 Klass* Dependencies::ctxk_encoded_as_null(DepType dept, Metadata* x) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
295 assert(must_be_in_vm(), "raw oops here");
a61af66fc99e Initial load
duke
parents:
diff changeset
296 switch (dept) {
a61af66fc99e Initial load
duke
parents:
diff changeset
297 case abstract_with_exclusive_concrete_subtypes_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
298 assert(x->is_klass(), "sanity");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
299 return (Klass*) x;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
300 case unique_concrete_method:
a61af66fc99e Initial load
duke
parents:
diff changeset
301 case exclusive_concrete_methods_2:
a61af66fc99e Initial load
duke
parents:
diff changeset
302 assert(x->is_method(), "sanity");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
303 return ((Method*)x)->method_holder();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
304 }
a61af66fc99e Initial load
duke
parents:
diff changeset
305 return NULL; // let NULL be NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
307
a61af66fc99e Initial load
duke
parents:
diff changeset
308 void Dependencies::encode_content_bytes() {
a61af66fc99e Initial load
duke
parents:
diff changeset
309 sort_all_deps();
a61af66fc99e Initial load
duke
parents:
diff changeset
310
a61af66fc99e Initial load
duke
parents:
diff changeset
311 // cast is safe, no deps can overflow INT_MAX
a61af66fc99e Initial load
duke
parents:
diff changeset
312 CompressedWriteStream bytes((int)estimate_size_in_bytes());
a61af66fc99e Initial load
duke
parents:
diff changeset
313
a61af66fc99e Initial load
duke
parents:
diff changeset
314 for (int deptv = (int)FIRST_TYPE; deptv < (int)TYPE_LIMIT; deptv++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
315 DepType dept = (DepType)deptv;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
316 GrowableArray<ciBaseObject*>* deps = _deps[dept];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
317 if (deps->length() == 0) continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
318 int stride = dep_args(dept);
a61af66fc99e Initial load
duke
parents:
diff changeset
319 int ctxkj = dep_context_arg(dept); // -1 if no context arg
a61af66fc99e Initial load
duke
parents:
diff changeset
320 assert(stride > 0, "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
321 for (int i = 0; i < deps->length(); i += stride) {
a61af66fc99e Initial load
duke
parents:
diff changeset
322 jbyte code_byte = (jbyte)dept;
a61af66fc99e Initial load
duke
parents:
diff changeset
323 int skipj = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
324 if (ctxkj >= 0 && ctxkj+1 < stride) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
325 ciKlass* ctxk = deps->at(i+ctxkj+0)->as_metadata()->as_klass();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
326 ciBaseObject* x = deps->at(i+ctxkj+1); // following argument
0
a61af66fc99e Initial load
duke
parents:
diff changeset
327 if (ctxk == ctxk_encoded_as_null(dept, x)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
328 skipj = ctxkj; // we win: maybe one less oop to keep track of
a61af66fc99e Initial load
duke
parents:
diff changeset
329 code_byte |= default_context_type_bit;
a61af66fc99e Initial load
duke
parents:
diff changeset
330 }
a61af66fc99e Initial load
duke
parents:
diff changeset
331 }
a61af66fc99e Initial load
duke
parents:
diff changeset
332 bytes.write_byte(code_byte);
a61af66fc99e Initial load
duke
parents:
diff changeset
333 for (int j = 0; j < stride; j++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
334 if (j == skipj) continue;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
335 ciBaseObject* v = deps->at(i+j);
6844
9a9b6e05ffb4 8000232: NPG: SIGSEGV in Dependencies::DepStream::check_klass_dependency on solaris-x64
vlivanov
parents: 6740
diff changeset
336 int idx;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
337 if (v->is_object()) {
6844
9a9b6e05ffb4 8000232: NPG: SIGSEGV in Dependencies::DepStream::check_klass_dependency on solaris-x64
vlivanov
parents: 6740
diff changeset
338 idx = _oop_recorder->find_index(v->as_object()->constant_encoding());
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
339 } else {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
340 ciMetadata* meta = v->as_metadata();
6844
9a9b6e05ffb4 8000232: NPG: SIGSEGV in Dependencies::DepStream::check_klass_dependency on solaris-x64
vlivanov
parents: 6740
diff changeset
341 idx = _oop_recorder->find_index(meta->constant_encoding());
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
342 }
6844
9a9b6e05ffb4 8000232: NPG: SIGSEGV in Dependencies::DepStream::check_klass_dependency on solaris-x64
vlivanov
parents: 6740
diff changeset
343 bytes.write_int(idx);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
344 }
a61af66fc99e Initial load
duke
parents:
diff changeset
345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
346 }
a61af66fc99e Initial load
duke
parents:
diff changeset
347
a61af66fc99e Initial load
duke
parents:
diff changeset
348 // write a sentinel byte to mark the end
a61af66fc99e Initial load
duke
parents:
diff changeset
349 bytes.write_byte(end_marker);
a61af66fc99e Initial load
duke
parents:
diff changeset
350
a61af66fc99e Initial load
duke
parents:
diff changeset
351 // round it out to a word boundary
a61af66fc99e Initial load
duke
parents:
diff changeset
352 while (bytes.position() % sizeof(HeapWord) != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
353 bytes.write_byte(end_marker);
a61af66fc99e Initial load
duke
parents:
diff changeset
354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
355
a61af66fc99e Initial load
duke
parents:
diff changeset
356 // check whether the dept byte encoding really works
a61af66fc99e Initial load
duke
parents:
diff changeset
357 assert((jbyte)default_context_type_bit != 0, "byte overflow");
a61af66fc99e Initial load
duke
parents:
diff changeset
358
a61af66fc99e Initial load
duke
parents:
diff changeset
359 _content_bytes = bytes.buffer();
a61af66fc99e Initial load
duke
parents:
diff changeset
360 _size_in_bytes = bytes.position();
a61af66fc99e Initial load
duke
parents:
diff changeset
361 }
a61af66fc99e Initial load
duke
parents:
diff changeset
362
a61af66fc99e Initial load
duke
parents:
diff changeset
363
a61af66fc99e Initial load
duke
parents:
diff changeset
364 const char* Dependencies::_dep_name[TYPE_LIMIT] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
365 "end_marker",
a61af66fc99e Initial load
duke
parents:
diff changeset
366 "evol_method",
a61af66fc99e Initial load
duke
parents:
diff changeset
367 "leaf_type",
a61af66fc99e Initial load
duke
parents:
diff changeset
368 "abstract_with_unique_concrete_subtype",
a61af66fc99e Initial load
duke
parents:
diff changeset
369 "abstract_with_no_concrete_subtype",
a61af66fc99e Initial load
duke
parents:
diff changeset
370 "concrete_with_no_concrete_subtype",
a61af66fc99e Initial load
duke
parents:
diff changeset
371 "unique_concrete_method",
a61af66fc99e Initial load
duke
parents:
diff changeset
372 "abstract_with_exclusive_concrete_subtypes_2",
a61af66fc99e Initial load
duke
parents:
diff changeset
373 "exclusive_concrete_methods_2",
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
374 "no_finalizable_subclasses",
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
375 "call_site_target_value"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
376 };
a61af66fc99e Initial load
duke
parents:
diff changeset
377
a61af66fc99e Initial load
duke
parents:
diff changeset
378 int Dependencies::_dep_args[TYPE_LIMIT] = {
a61af66fc99e Initial load
duke
parents:
diff changeset
379 -1,// end_marker
a61af66fc99e Initial load
duke
parents:
diff changeset
380 1, // evol_method m
a61af66fc99e Initial load
duke
parents:
diff changeset
381 1, // leaf_type ctxk
a61af66fc99e Initial load
duke
parents:
diff changeset
382 2, // abstract_with_unique_concrete_subtype ctxk, k
a61af66fc99e Initial load
duke
parents:
diff changeset
383 1, // abstract_with_no_concrete_subtype ctxk
a61af66fc99e Initial load
duke
parents:
diff changeset
384 1, // concrete_with_no_concrete_subtype ctxk
a61af66fc99e Initial load
duke
parents:
diff changeset
385 2, // unique_concrete_method ctxk, m
a61af66fc99e Initial load
duke
parents:
diff changeset
386 3, // unique_concrete_subtypes_2 ctxk, k1, k2
a61af66fc99e Initial load
duke
parents:
diff changeset
387 3, // unique_concrete_methods_2 ctxk, m1, m2
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
388 1, // no_finalizable_subclasses ctxk
3894
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
389 2 // call_site_target_value call_site, method_handle
0
a61af66fc99e Initial load
duke
parents:
diff changeset
390 };
a61af66fc99e Initial load
duke
parents:
diff changeset
391
a61af66fc99e Initial load
duke
parents:
diff changeset
392 const char* Dependencies::dep_name(Dependencies::DepType dept) {
a61af66fc99e Initial load
duke
parents:
diff changeset
393 if (!dept_in_mask(dept, all_types)) return "?bad-dep?";
a61af66fc99e Initial load
duke
parents:
diff changeset
394 return _dep_name[dept];
a61af66fc99e Initial load
duke
parents:
diff changeset
395 }
a61af66fc99e Initial load
duke
parents:
diff changeset
396
a61af66fc99e Initial load
duke
parents:
diff changeset
397 int Dependencies::dep_args(Dependencies::DepType dept) {
a61af66fc99e Initial load
duke
parents:
diff changeset
398 if (!dept_in_mask(dept, all_types)) return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
399 return _dep_args[dept];
a61af66fc99e Initial load
duke
parents:
diff changeset
400 }
a61af66fc99e Initial load
duke
parents:
diff changeset
401
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
402 void Dependencies::check_valid_dependency_type(DepType dept) {
3894
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
403 guarantee(FIRST_TYPE <= dept && dept < TYPE_LIMIT, err_msg("invalid dependency type: %d", (int) dept));
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
404 }
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
405
0
a61af66fc99e Initial load
duke
parents:
diff changeset
406 // for the sake of the compiler log, print out current dependencies:
a61af66fc99e Initial load
duke
parents:
diff changeset
407 void Dependencies::log_all_dependencies() {
a61af66fc99e Initial load
duke
parents:
diff changeset
408 if (log() == NULL) return;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
409 ciBaseObject* args[max_arg_count];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
410 for (int deptv = (int)FIRST_TYPE; deptv < (int)TYPE_LIMIT; deptv++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
411 DepType dept = (DepType)deptv;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
412 GrowableArray<ciBaseObject*>* deps = _deps[dept];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
413 if (deps->length() == 0) continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
414 int stride = dep_args(dept);
a61af66fc99e Initial load
duke
parents:
diff changeset
415 for (int i = 0; i < deps->length(); i += stride) {
a61af66fc99e Initial load
duke
parents:
diff changeset
416 for (int j = 0; j < stride; j++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
417 // flush out the identities before printing
a61af66fc99e Initial load
duke
parents:
diff changeset
418 args[j] = deps->at(i+j);
a61af66fc99e Initial load
duke
parents:
diff changeset
419 }
a61af66fc99e Initial load
duke
parents:
diff changeset
420 write_dependency_to(log(), dept, stride, args);
a61af66fc99e Initial load
duke
parents:
diff changeset
421 }
a61af66fc99e Initial load
duke
parents:
diff changeset
422 }
a61af66fc99e Initial load
duke
parents:
diff changeset
423 }
a61af66fc99e Initial load
duke
parents:
diff changeset
424
a61af66fc99e Initial load
duke
parents:
diff changeset
425 void Dependencies::write_dependency_to(CompileLog* log,
a61af66fc99e Initial load
duke
parents:
diff changeset
426 DepType dept,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
427 int nargs, DepArgument args[],
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
428 Klass* witness) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
429 if (log == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
430 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
431 }
a61af66fc99e Initial load
duke
parents:
diff changeset
432 ciEnv* env = ciEnv::current();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
433 ciBaseObject* ciargs[max_arg_count];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
434 assert(nargs <= max_arg_count, "oob");
a61af66fc99e Initial load
duke
parents:
diff changeset
435 for (int j = 0; j < nargs; j++) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
436 if (args[j].is_oop()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
437 ciargs[j] = env->get_object(args[j].oop_value());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
438 } else {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
439 ciargs[j] = env->get_metadata(args[j].metadata_value());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
440 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
441 }
a61af66fc99e Initial load
duke
parents:
diff changeset
442 Dependencies::write_dependency_to(log, dept, nargs, ciargs, witness);
a61af66fc99e Initial load
duke
parents:
diff changeset
443 }
a61af66fc99e Initial load
duke
parents:
diff changeset
444
a61af66fc99e Initial load
duke
parents:
diff changeset
445 void Dependencies::write_dependency_to(CompileLog* log,
a61af66fc99e Initial load
duke
parents:
diff changeset
446 DepType dept,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
447 int nargs, ciBaseObject* args[],
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
448 Klass* witness) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
449 if (log == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
450 assert(nargs <= max_arg_count, "oob");
a61af66fc99e Initial load
duke
parents:
diff changeset
451 int argids[max_arg_count];
a61af66fc99e Initial load
duke
parents:
diff changeset
452 int ctxkj = dep_context_arg(dept); // -1 if no context arg
a61af66fc99e Initial load
duke
parents:
diff changeset
453 int j;
a61af66fc99e Initial load
duke
parents:
diff changeset
454 for (j = 0; j < nargs; j++) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
455 if (args[j]->is_object()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
456 argids[j] = log->identify(args[j]->as_object());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
457 } else {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
458 argids[j] = log->identify(args[j]->as_metadata());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
459 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
460 }
a61af66fc99e Initial load
duke
parents:
diff changeset
461 if (witness != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
462 log->begin_elem("dependency_failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
463 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
464 log->begin_elem("dependency");
a61af66fc99e Initial load
duke
parents:
diff changeset
465 }
a61af66fc99e Initial load
duke
parents:
diff changeset
466 log->print(" type='%s'", dep_name(dept));
a61af66fc99e Initial load
duke
parents:
diff changeset
467 if (ctxkj >= 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
468 log->print(" ctxk='%d'", argids[ctxkj]);
a61af66fc99e Initial load
duke
parents:
diff changeset
469 }
a61af66fc99e Initial load
duke
parents:
diff changeset
470 // write remaining arguments, if any.
a61af66fc99e Initial load
duke
parents:
diff changeset
471 for (j = 0; j < nargs; j++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
472 if (j == ctxkj) continue; // already logged
a61af66fc99e Initial load
duke
parents:
diff changeset
473 if (j == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
474 log->print( " x='%d'", argids[j]);
a61af66fc99e Initial load
duke
parents:
diff changeset
475 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
476 log->print(" x%d='%d'", j, argids[j]);
a61af66fc99e Initial load
duke
parents:
diff changeset
477 }
a61af66fc99e Initial load
duke
parents:
diff changeset
478 }
a61af66fc99e Initial load
duke
parents:
diff changeset
479 if (witness != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
480 log->object("witness", witness);
a61af66fc99e Initial load
duke
parents:
diff changeset
481 log->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
482 }
a61af66fc99e Initial load
duke
parents:
diff changeset
483 log->end_elem();
a61af66fc99e Initial load
duke
parents:
diff changeset
484 }
a61af66fc99e Initial load
duke
parents:
diff changeset
485
a61af66fc99e Initial load
duke
parents:
diff changeset
486 void Dependencies::write_dependency_to(xmlStream* xtty,
a61af66fc99e Initial load
duke
parents:
diff changeset
487 DepType dept,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
488 int nargs, DepArgument args[],
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
489 Klass* witness) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
490 if (xtty == NULL) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
491 ttyLocker ttyl;
a61af66fc99e Initial load
duke
parents:
diff changeset
492 int ctxkj = dep_context_arg(dept); // -1 if no context arg
a61af66fc99e Initial load
duke
parents:
diff changeset
493 if (witness != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
494 xtty->begin_elem("dependency_failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
495 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
496 xtty->begin_elem("dependency");
a61af66fc99e Initial load
duke
parents:
diff changeset
497 }
a61af66fc99e Initial load
duke
parents:
diff changeset
498 xtty->print(" type='%s'", dep_name(dept));
a61af66fc99e Initial load
duke
parents:
diff changeset
499 if (ctxkj >= 0) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
500 xtty->object("ctxk", args[ctxkj].metadata_value());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
501 }
a61af66fc99e Initial load
duke
parents:
diff changeset
502 // write remaining arguments, if any.
a61af66fc99e Initial load
duke
parents:
diff changeset
503 for (int j = 0; j < nargs; j++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
504 if (j == ctxkj) continue; // already logged
a61af66fc99e Initial load
duke
parents:
diff changeset
505 if (j == 1) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
506 if (args[j].is_oop()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
507 xtty->object("x", args[j].oop_value());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
508 } else {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
509 xtty->object("x", args[j].metadata_value());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
510 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
511 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
512 char xn[10]; sprintf(xn, "x%d", j);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
513 if (args[j].is_oop()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
514 xtty->object(xn, args[j].oop_value());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
515 } else {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
516 xtty->object(xn, args[j].metadata_value());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
517 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
518 }
a61af66fc99e Initial load
duke
parents:
diff changeset
519 }
a61af66fc99e Initial load
duke
parents:
diff changeset
520 if (witness != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
521 xtty->object("witness", witness);
a61af66fc99e Initial load
duke
parents:
diff changeset
522 xtty->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
523 }
a61af66fc99e Initial load
duke
parents:
diff changeset
524 xtty->end_elem();
a61af66fc99e Initial load
duke
parents:
diff changeset
525 }
a61af66fc99e Initial load
duke
parents:
diff changeset
526
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
527 void Dependencies::print_dependency(DepType dept, int nargs, DepArgument args[],
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
528 Klass* witness) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
529 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
530 ttyLocker ttyl; // keep the following output all in one block
a61af66fc99e Initial load
duke
parents:
diff changeset
531 tty->print_cr("%s of type %s",
a61af66fc99e Initial load
duke
parents:
diff changeset
532 (witness == NULL)? "Dependency": "Failed dependency",
a61af66fc99e Initial load
duke
parents:
diff changeset
533 dep_name(dept));
a61af66fc99e Initial load
duke
parents:
diff changeset
534 // print arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
535 int ctxkj = dep_context_arg(dept); // -1 if no context arg
a61af66fc99e Initial load
duke
parents:
diff changeset
536 for (int j = 0; j < nargs; j++) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
537 DepArgument arg = args[j];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
538 bool put_star = false;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
539 if (arg.is_null()) continue;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
540 const char* what;
a61af66fc99e Initial load
duke
parents:
diff changeset
541 if (j == ctxkj) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
542 assert(arg.is_metadata(), "must be");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
543 what = "context";
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
544 put_star = !Dependencies::is_concrete_klass((Klass*)arg.metadata_value());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
545 } else if (arg.is_method()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
546 what = "method ";
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
547 put_star = !Dependencies::is_concrete_method((Method*)arg.metadata_value());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
548 } else if (arg.is_klass()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
549 what = "class ";
a61af66fc99e Initial load
duke
parents:
diff changeset
550 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
551 what = "object ";
a61af66fc99e Initial load
duke
parents:
diff changeset
552 }
a61af66fc99e Initial load
duke
parents:
diff changeset
553 tty->print(" %s = %s", what, (put_star? "*": ""));
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
554 if (arg.is_klass())
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
555 tty->print("%s", Klass::cast((Klass*)arg.metadata_value())->external_name());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
556 else if (arg.is_method())
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
557 ((Method*)arg.metadata_value())->print_value();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
558 else
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
559 ShouldNotReachHere(); // Provide impl for this type.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
560 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
561 }
a61af66fc99e Initial load
duke
parents:
diff changeset
562 if (witness != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
563 bool put_star = !Dependencies::is_concrete_klass(witness);
a61af66fc99e Initial load
duke
parents:
diff changeset
564 tty->print_cr(" witness = %s%s",
a61af66fc99e Initial load
duke
parents:
diff changeset
565 (put_star? "*": ""),
a61af66fc99e Initial load
duke
parents:
diff changeset
566 Klass::cast(witness)->external_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
567 }
a61af66fc99e Initial load
duke
parents:
diff changeset
568 }
a61af66fc99e Initial load
duke
parents:
diff changeset
569
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
570 void Dependencies::DepStream::log_dependency(Klass* witness) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
571 if (_deps == NULL && xtty == NULL) return; // fast cutout for runtime
6972
bd7a7ce2e264 6830717: replay of compilations would help with debugging
minqi
parents: 6940
diff changeset
572 ResourceMark rm;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
573 int nargs = argument_count();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
574 DepArgument args[max_arg_count];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
575 for (int j = 0; j < nargs; j++) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
576 if (type() == call_site_target_value) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
577 args[j] = argument_oop(j);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
578 } else {
6844
9a9b6e05ffb4 8000232: NPG: SIGSEGV in Dependencies::DepStream::check_klass_dependency on solaris-x64
vlivanov
parents: 6740
diff changeset
579 args[j] = argument(j);
9a9b6e05ffb4 8000232: NPG: SIGSEGV in Dependencies::DepStream::check_klass_dependency on solaris-x64
vlivanov
parents: 6740
diff changeset
580 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
581 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
582 if (_deps != NULL && _deps->log() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
583 Dependencies::write_dependency_to(_deps->log(),
a61af66fc99e Initial load
duke
parents:
diff changeset
584 type(), nargs, args, witness);
a61af66fc99e Initial load
duke
parents:
diff changeset
585 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
586 Dependencies::write_dependency_to(xtty,
a61af66fc99e Initial load
duke
parents:
diff changeset
587 type(), nargs, args, witness);
a61af66fc99e Initial load
duke
parents:
diff changeset
588 }
a61af66fc99e Initial load
duke
parents:
diff changeset
589 }
a61af66fc99e Initial load
duke
parents:
diff changeset
590
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
591 void Dependencies::DepStream::print_dependency(Klass* witness, bool verbose) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
592 int nargs = argument_count();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
593 DepArgument args[max_arg_count];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
594 for (int j = 0; j < nargs; j++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
595 args[j] = argument(j);
a61af66fc99e Initial load
duke
parents:
diff changeset
596 }
a61af66fc99e Initial load
duke
parents:
diff changeset
597 Dependencies::print_dependency(type(), nargs, args, witness);
a61af66fc99e Initial load
duke
parents:
diff changeset
598 if (verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
599 if (_code != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
600 tty->print(" code: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
601 _code->print_value_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
602 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
603 }
a61af66fc99e Initial load
duke
parents:
diff changeset
604 }
a61af66fc99e Initial load
duke
parents:
diff changeset
605 }
a61af66fc99e Initial load
duke
parents:
diff changeset
606
a61af66fc99e Initial load
duke
parents:
diff changeset
607
a61af66fc99e Initial load
duke
parents:
diff changeset
608 /// Dependency stream support (decodes dependencies from an nmethod):
a61af66fc99e Initial load
duke
parents:
diff changeset
609
a61af66fc99e Initial load
duke
parents:
diff changeset
610 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
611 void Dependencies::DepStream::initial_asserts(size_t byte_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
612 assert(must_be_in_vm(), "raw oops here");
a61af66fc99e Initial load
duke
parents:
diff changeset
613 _byte_limit = byte_limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
614 _type = (DepType)(end_marker-1); // defeat "already at end" assert
a61af66fc99e Initial load
duke
parents:
diff changeset
615 assert((_code!=NULL) + (_deps!=NULL) == 1, "one or t'other");
a61af66fc99e Initial load
duke
parents:
diff changeset
616 }
a61af66fc99e Initial load
duke
parents:
diff changeset
617 #endif //ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
618
a61af66fc99e Initial load
duke
parents:
diff changeset
619 bool Dependencies::DepStream::next() {
a61af66fc99e Initial load
duke
parents:
diff changeset
620 assert(_type != end_marker, "already at end");
a61af66fc99e Initial load
duke
parents:
diff changeset
621 if (_bytes.position() == 0 && _code != NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
622 && _code->dependencies_size() == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
623 // Method has no dependencies at all.
a61af66fc99e Initial load
duke
parents:
diff changeset
624 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
625 }
a61af66fc99e Initial load
duke
parents:
diff changeset
626 int code_byte = (_bytes.read_byte() & 0xFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
627 if (code_byte == end_marker) {
a61af66fc99e Initial load
duke
parents:
diff changeset
628 DEBUG_ONLY(_type = end_marker);
a61af66fc99e Initial load
duke
parents:
diff changeset
629 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
630 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
631 int ctxk_bit = (code_byte & Dependencies::default_context_type_bit);
a61af66fc99e Initial load
duke
parents:
diff changeset
632 code_byte -= ctxk_bit;
a61af66fc99e Initial load
duke
parents:
diff changeset
633 DepType dept = (DepType)code_byte;
a61af66fc99e Initial load
duke
parents:
diff changeset
634 _type = dept;
3894
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
635 Dependencies::check_valid_dependency_type(dept);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
636 int stride = _dep_args[dept];
a61af66fc99e Initial load
duke
parents:
diff changeset
637 assert(stride == dep_args(dept), "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
638 int skipj = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
639 if (ctxk_bit != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
640 skipj = 0; // currently the only context argument is at zero
a61af66fc99e Initial load
duke
parents:
diff changeset
641 assert(skipj == dep_context_arg(dept), "zero arg always ctxk");
a61af66fc99e Initial load
duke
parents:
diff changeset
642 }
a61af66fc99e Initial load
duke
parents:
diff changeset
643 for (int j = 0; j < stride; j++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
644 _xi[j] = (j == skipj)? 0: _bytes.read_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
645 }
a61af66fc99e Initial load
duke
parents:
diff changeset
646 DEBUG_ONLY(_xi[stride] = -1); // help detect overruns
a61af66fc99e Initial load
duke
parents:
diff changeset
647 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
648 }
a61af66fc99e Initial load
duke
parents:
diff changeset
649 }
a61af66fc99e Initial load
duke
parents:
diff changeset
650
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
651 inline Metadata* Dependencies::DepStream::recorded_metadata_at(int i) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
652 Metadata* o = NULL;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
653 if (_code != NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
654 o = _code->metadata_at(i);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
655 } else {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
656 o = _deps->oop_recorder()->metadata_at(i);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
657 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
658 assert(o == NULL || o->is_metadata(),
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
659 err_msg("Should be perm " PTR_FORMAT, o));
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
660 return o;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
661 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
662
0
a61af66fc99e Initial load
duke
parents:
diff changeset
663 inline oop Dependencies::DepStream::recorded_oop_at(int i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
664 return (_code != NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
665 ? _code->oop_at(i)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
666 : JNIHandles::resolve(_deps->oop_recorder()->oop_at(i));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
667 }
a61af66fc99e Initial load
duke
parents:
diff changeset
668
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
669 Metadata* Dependencies::DepStream::argument(int i) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
670 Metadata* result = recorded_metadata_at(argument_index(i));
6844
9a9b6e05ffb4 8000232: NPG: SIGSEGV in Dependencies::DepStream::check_klass_dependency on solaris-x64
vlivanov
parents: 6740
diff changeset
671
9a9b6e05ffb4 8000232: NPG: SIGSEGV in Dependencies::DepStream::check_klass_dependency on solaris-x64
vlivanov
parents: 6740
diff changeset
672 if (result == NULL) { // Explicit context argument can be compressed
9a9b6e05ffb4 8000232: NPG: SIGSEGV in Dependencies::DepStream::check_klass_dependency on solaris-x64
vlivanov
parents: 6740
diff changeset
673 int ctxkj = dep_context_arg(type()); // -1 if no explicit context arg
9a9b6e05ffb4 8000232: NPG: SIGSEGV in Dependencies::DepStream::check_klass_dependency on solaris-x64
vlivanov
parents: 6740
diff changeset
674 if (ctxkj >= 0 && i == ctxkj && ctxkj+1 < argument_count()) {
9a9b6e05ffb4 8000232: NPG: SIGSEGV in Dependencies::DepStream::check_klass_dependency on solaris-x64
vlivanov
parents: 6740
diff changeset
675 result = ctxk_encoded_as_null(type(), argument(ctxkj+1));
9a9b6e05ffb4 8000232: NPG: SIGSEGV in Dependencies::DepStream::check_klass_dependency on solaris-x64
vlivanov
parents: 6740
diff changeset
676 }
9a9b6e05ffb4 8000232: NPG: SIGSEGV in Dependencies::DepStream::check_klass_dependency on solaris-x64
vlivanov
parents: 6740
diff changeset
677 }
9a9b6e05ffb4 8000232: NPG: SIGSEGV in Dependencies::DepStream::check_klass_dependency on solaris-x64
vlivanov
parents: 6740
diff changeset
678
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
679 assert(result == NULL || result->is_klass() || result->is_method(), "must be");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
680 return result;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
681 }
a61af66fc99e Initial load
duke
parents:
diff changeset
682
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
683 oop Dependencies::DepStream::argument_oop(int i) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
684 oop result = recorded_oop_at(argument_index(i));
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
685 assert(result == NULL || result->is_oop(), "must be");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
686 return result;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
687 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
688
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
689 Klass* Dependencies::DepStream::context_type() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
690 assert(must_be_in_vm(), "raw oops here");
3894
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
691
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
692 // Most dependencies have an explicit context type argument.
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
693 {
6844
9a9b6e05ffb4 8000232: NPG: SIGSEGV in Dependencies::DepStream::check_klass_dependency on solaris-x64
vlivanov
parents: 6740
diff changeset
694 int ctxkj = dep_context_arg(type()); // -1 if no explicit context arg
3894
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
695 if (ctxkj >= 0) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
696 Metadata* k = argument(ctxkj);
6844
9a9b6e05ffb4 8000232: NPG: SIGSEGV in Dependencies::DepStream::check_klass_dependency on solaris-x64
vlivanov
parents: 6740
diff changeset
697 assert(k != NULL && k->is_klass(), "type check");
9a9b6e05ffb4 8000232: NPG: SIGSEGV in Dependencies::DepStream::check_klass_dependency on solaris-x64
vlivanov
parents: 6740
diff changeset
698 return (Klass*)k;
3894
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
699 }
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
700 }
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
701
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
702 // Some dependencies are using the klass of the first object
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
703 // argument as implicit context type (e.g. call_site_target_value).
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
704 {
6844
9a9b6e05ffb4 8000232: NPG: SIGSEGV in Dependencies::DepStream::check_klass_dependency on solaris-x64
vlivanov
parents: 6740
diff changeset
705 int ctxkj = dep_implicit_context_arg(type());
3894
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
706 if (ctxkj >= 0) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
707 Klass* k = argument_oop(ctxkj)->klass();
6844
9a9b6e05ffb4 8000232: NPG: SIGSEGV in Dependencies::DepStream::check_klass_dependency on solaris-x64
vlivanov
parents: 6740
diff changeset
708 assert(k != NULL && k->is_klass(), "type check");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
709 return (Klass*) k;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
710 }
a61af66fc99e Initial load
duke
parents:
diff changeset
711 }
3894
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
712
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
713 // And some dependencies don't have a context type at all,
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
714 // e.g. evol_method.
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
715 return NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
716 }
a61af66fc99e Initial load
duke
parents:
diff changeset
717
a61af66fc99e Initial load
duke
parents:
diff changeset
718 /// Checking dependencies:
a61af66fc99e Initial load
duke
parents:
diff changeset
719
a61af66fc99e Initial load
duke
parents:
diff changeset
720 // This hierarchy walker inspects subtypes of a given type,
a61af66fc99e Initial load
duke
parents:
diff changeset
721 // trying to find a "bad" class which breaks a dependency.
a61af66fc99e Initial load
duke
parents:
diff changeset
722 // Such a class is called a "witness" to the broken dependency.
a61af66fc99e Initial load
duke
parents:
diff changeset
723 // While searching around, we ignore "participants", which
a61af66fc99e Initial load
duke
parents:
diff changeset
724 // are already known to the dependency.
a61af66fc99e Initial load
duke
parents:
diff changeset
725 class ClassHierarchyWalker {
a61af66fc99e Initial load
duke
parents:
diff changeset
726 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
727 enum { PARTICIPANT_LIMIT = 3 };
a61af66fc99e Initial load
duke
parents:
diff changeset
728
a61af66fc99e Initial load
duke
parents:
diff changeset
729 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
730 // optional method descriptor to check for:
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
731 Symbol* _name;
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
732 Symbol* _signature;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
733
a61af66fc99e Initial load
duke
parents:
diff changeset
734 // special classes which are not allowed to be witnesses:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
735 Klass* _participants[PARTICIPANT_LIMIT+1];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
736 int _num_participants;
a61af66fc99e Initial load
duke
parents:
diff changeset
737
a61af66fc99e Initial load
duke
parents:
diff changeset
738 // cache of method lookups
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
739 Method* _found_methods[PARTICIPANT_LIMIT+1];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
740
a61af66fc99e Initial load
duke
parents:
diff changeset
741 // if non-zero, tells how many witnesses to convert to participants
a61af66fc99e Initial load
duke
parents:
diff changeset
742 int _record_witnesses;
a61af66fc99e Initial load
duke
parents:
diff changeset
743
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
744 void initialize(Klass* participant) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
745 _record_witnesses = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
746 _participants[0] = participant;
a61af66fc99e Initial load
duke
parents:
diff changeset
747 _found_methods[0] = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
748 _num_participants = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
749 if (participant != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
750 // Terminating NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
751 _participants[1] = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
752 _found_methods[1] = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
753 _num_participants = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
754 }
a61af66fc99e Initial load
duke
parents:
diff changeset
755 }
a61af66fc99e Initial load
duke
parents:
diff changeset
756
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
757 void initialize_from_method(Method* m) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
758 assert(m != NULL && m->is_method(), "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
759 _name = m->name();
a61af66fc99e Initial load
duke
parents:
diff changeset
760 _signature = m->signature();
a61af66fc99e Initial load
duke
parents:
diff changeset
761 }
a61af66fc99e Initial load
duke
parents:
diff changeset
762
a61af66fc99e Initial load
duke
parents:
diff changeset
763 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
764 // The walker is initialized to recognize certain methods and/or types
a61af66fc99e Initial load
duke
parents:
diff changeset
765 // as friendly participants.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
766 ClassHierarchyWalker(Klass* participant, Method* m) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
767 initialize_from_method(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
768 initialize(participant);
a61af66fc99e Initial load
duke
parents:
diff changeset
769 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
770 ClassHierarchyWalker(Method* m) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
771 initialize_from_method(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
772 initialize(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
773 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
774 ClassHierarchyWalker(Klass* participant = NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
775 _name = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
776 _signature = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
777 initialize(participant);
a61af66fc99e Initial load
duke
parents:
diff changeset
778 }
a61af66fc99e Initial load
duke
parents:
diff changeset
779
a61af66fc99e Initial load
duke
parents:
diff changeset
780 // This is common code for two searches: One for concrete subtypes,
a61af66fc99e Initial load
duke
parents:
diff changeset
781 // the other for concrete method implementations and overrides.
a61af66fc99e Initial load
duke
parents:
diff changeset
782 bool doing_subtype_search() {
a61af66fc99e Initial load
duke
parents:
diff changeset
783 return _name == NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
784 }
a61af66fc99e Initial load
duke
parents:
diff changeset
785
a61af66fc99e Initial load
duke
parents:
diff changeset
786 int num_participants() { return _num_participants; }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
787 Klass* participant(int n) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
788 assert((uint)n <= (uint)_num_participants, "oob");
a61af66fc99e Initial load
duke
parents:
diff changeset
789 return _participants[n];
a61af66fc99e Initial load
duke
parents:
diff changeset
790 }
a61af66fc99e Initial load
duke
parents:
diff changeset
791
a61af66fc99e Initial load
duke
parents:
diff changeset
792 // Note: If n==num_participants, returns NULL.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
793 Method* found_method(int n) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
794 assert((uint)n <= (uint)_num_participants, "oob");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
795 Method* fm = _found_methods[n];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
796 assert(n == _num_participants || fm != NULL, "proper usage");
a61af66fc99e Initial load
duke
parents:
diff changeset
797 assert(fm == NULL || fm->method_holder() == _participants[n], "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
798 return fm;
a61af66fc99e Initial load
duke
parents:
diff changeset
799 }
a61af66fc99e Initial load
duke
parents:
diff changeset
800
a61af66fc99e Initial load
duke
parents:
diff changeset
801 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
802 // Assert that m is inherited into ctxk, without intervening overrides.
a61af66fc99e Initial load
duke
parents:
diff changeset
803 // (May return true even if this is not true, in corner cases where we punt.)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
804 bool check_method_context(Klass* ctxk, Method* m) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
805 if (m->method_holder() == ctxk)
a61af66fc99e Initial load
duke
parents:
diff changeset
806 return true; // Quick win.
a61af66fc99e Initial load
duke
parents:
diff changeset
807 if (m->is_private())
a61af66fc99e Initial load
duke
parents:
diff changeset
808 return false; // Quick lose. Should not happen.
a61af66fc99e Initial load
duke
parents:
diff changeset
809 if (!(m->is_public() || m->is_protected()))
a61af66fc99e Initial load
duke
parents:
diff changeset
810 // The override story is complex when packages get involved.
a61af66fc99e Initial load
duke
parents:
diff changeset
811 return true; // Must punt the assertion to true.
a61af66fc99e Initial load
duke
parents:
diff changeset
812 Klass* k = Klass::cast(ctxk);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
813 Method* lm = k->lookup_method(m->name(), m->signature());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
814 if (lm == NULL && k->oop_is_instance()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
815 // It might be an abstract interface method, devoid of mirandas.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
816 lm = ((InstanceKlass*)k)->lookup_method_in_all_interfaces(m->name(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
817 m->signature());
a61af66fc99e Initial load
duke
parents:
diff changeset
818 }
a61af66fc99e Initial load
duke
parents:
diff changeset
819 if (lm == m)
a61af66fc99e Initial load
duke
parents:
diff changeset
820 // Method m is inherited into ctxk.
a61af66fc99e Initial load
duke
parents:
diff changeset
821 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
822 if (lm != NULL) {
4060
c9a03402fe56 7105305: assert check_method_context proper context
never
parents: 3894
diff changeset
823 if (!(lm->is_public() || lm->is_protected())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
824 // Method is [package-]private, so the override story is complex.
a61af66fc99e Initial load
duke
parents:
diff changeset
825 return true; // Must punt the assertion to true.
4060
c9a03402fe56 7105305: assert check_method_context proper context
never
parents: 3894
diff changeset
826 }
c9a03402fe56 7105305: assert check_method_context proper context
never
parents: 3894
diff changeset
827 if (lm->is_static()) {
c9a03402fe56 7105305: assert check_method_context proper context
never
parents: 3894
diff changeset
828 // Static methods don't override non-static so punt
c9a03402fe56 7105305: assert check_method_context proper context
never
parents: 3894
diff changeset
829 return true;
c9a03402fe56 7105305: assert check_method_context proper context
never
parents: 3894
diff changeset
830 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
831 if ( !Dependencies::is_concrete_method(lm)
a61af66fc99e Initial load
duke
parents:
diff changeset
832 && !Dependencies::is_concrete_method(m)
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6934
diff changeset
833 && lm->method_holder()->is_subtype_of(m->method_holder()))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
834 // Method m is overridden by lm, but both are non-concrete.
a61af66fc99e Initial load
duke
parents:
diff changeset
835 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
836 }
a61af66fc99e Initial load
duke
parents:
diff changeset
837 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
838 tty->print_cr("Dependency method not found in the associated context:");
a61af66fc99e Initial load
duke
parents:
diff changeset
839 tty->print_cr(" context = %s", Klass::cast(ctxk)->external_name());
a61af66fc99e Initial load
duke
parents:
diff changeset
840 tty->print( " method = "); m->print_short_name(tty); tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
841 if (lm != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
842 tty->print( " found = "); lm->print_short_name(tty); tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
843 }
a61af66fc99e Initial load
duke
parents:
diff changeset
844 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
845 }
a61af66fc99e Initial load
duke
parents:
diff changeset
846 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
847
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
848 void add_participant(Klass* participant) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
849 assert(_num_participants + _record_witnesses < PARTICIPANT_LIMIT, "oob");
a61af66fc99e Initial load
duke
parents:
diff changeset
850 int np = _num_participants++;
a61af66fc99e Initial load
duke
parents:
diff changeset
851 _participants[np] = participant;
a61af66fc99e Initial load
duke
parents:
diff changeset
852 _participants[np+1] = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
853 _found_methods[np+1] = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
854 }
a61af66fc99e Initial load
duke
parents:
diff changeset
855
a61af66fc99e Initial load
duke
parents:
diff changeset
856 void record_witnesses(int add) {
a61af66fc99e Initial load
duke
parents:
diff changeset
857 if (add > PARTICIPANT_LIMIT) add = PARTICIPANT_LIMIT;
a61af66fc99e Initial load
duke
parents:
diff changeset
858 assert(_num_participants + add < PARTICIPANT_LIMIT, "oob");
a61af66fc99e Initial load
duke
parents:
diff changeset
859 _record_witnesses = add;
a61af66fc99e Initial load
duke
parents:
diff changeset
860 }
a61af66fc99e Initial load
duke
parents:
diff changeset
861
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
862 bool is_witness(Klass* k) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
863 if (doing_subtype_search()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
864 return Dependencies::is_concrete_klass(k);
a61af66fc99e Initial load
duke
parents:
diff changeset
865 } else {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
866 Method* m = InstanceKlass::cast(k)->find_method(_name, _signature);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
867 if (m == NULL || !Dependencies::is_concrete_method(m)) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
868 _found_methods[_num_participants] = m;
a61af66fc99e Initial load
duke
parents:
diff changeset
869 // Note: If add_participant(k) is called,
a61af66fc99e Initial load
duke
parents:
diff changeset
870 // the method m will already be memoized for it.
a61af66fc99e Initial load
duke
parents:
diff changeset
871 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
872 }
a61af66fc99e Initial load
duke
parents:
diff changeset
873 }
a61af66fc99e Initial load
duke
parents:
diff changeset
874
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
875 bool is_participant(Klass* k) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
876 if (k == _participants[0]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
877 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
878 } else if (_num_participants <= 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
879 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
880 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
881 return in_list(k, &_participants[1]);
a61af66fc99e Initial load
duke
parents:
diff changeset
882 }
a61af66fc99e Initial load
duke
parents:
diff changeset
883 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
884 bool ignore_witness(Klass* witness) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
885 if (_record_witnesses == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
886 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
887 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
888 --_record_witnesses;
a61af66fc99e Initial load
duke
parents:
diff changeset
889 add_participant(witness);
a61af66fc99e Initial load
duke
parents:
diff changeset
890 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
891 }
a61af66fc99e Initial load
duke
parents:
diff changeset
892 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
893 static bool in_list(Klass* x, Klass** list) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
894 for (int i = 0; ; i++) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
895 Klass* y = list[i];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
896 if (y == NULL) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
897 if (y == x) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
898 }
a61af66fc99e Initial load
duke
parents:
diff changeset
899 return false; // not in list
a61af66fc99e Initial load
duke
parents:
diff changeset
900 }
a61af66fc99e Initial load
duke
parents:
diff changeset
901
a61af66fc99e Initial load
duke
parents:
diff changeset
902 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
903 // the actual search method:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
904 Klass* find_witness_anywhere(Klass* context_type,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
905 bool participants_hide_witnesses,
a61af66fc99e Initial load
duke
parents:
diff changeset
906 bool top_level_call = true);
a61af66fc99e Initial load
duke
parents:
diff changeset
907 // the spot-checking version:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
908 Klass* find_witness_in(KlassDepChange& changes,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
909 Klass* context_type,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
910 bool participants_hide_witnesses);
a61af66fc99e Initial load
duke
parents:
diff changeset
911 public:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
912 Klass* find_witness_subtype(Klass* context_type, KlassDepChange* changes = NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
913 assert(doing_subtype_search(), "must set up a subtype search");
a61af66fc99e Initial load
duke
parents:
diff changeset
914 // When looking for unexpected concrete types,
a61af66fc99e Initial load
duke
parents:
diff changeset
915 // do not look beneath expected ones.
a61af66fc99e Initial load
duke
parents:
diff changeset
916 const bool participants_hide_witnesses = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
917 // CX > CC > C' is OK, even if C' is new.
a61af66fc99e Initial load
duke
parents:
diff changeset
918 // CX > { CC, C' } is not OK if C' is new, and C' is the witness.
a61af66fc99e Initial load
duke
parents:
diff changeset
919 if (changes != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
920 return find_witness_in(*changes, context_type, participants_hide_witnesses);
a61af66fc99e Initial load
duke
parents:
diff changeset
921 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
922 return find_witness_anywhere(context_type, participants_hide_witnesses);
a61af66fc99e Initial load
duke
parents:
diff changeset
923 }
a61af66fc99e Initial load
duke
parents:
diff changeset
924 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
925 Klass* find_witness_definer(Klass* context_type, KlassDepChange* changes = NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
926 assert(!doing_subtype_search(), "must set up a method definer search");
a61af66fc99e Initial load
duke
parents:
diff changeset
927 // When looking for unexpected concrete methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
928 // look beneath expected ones, to see if there are overrides.
a61af66fc99e Initial load
duke
parents:
diff changeset
929 const bool participants_hide_witnesses = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
930 // CX.m > CC.m > C'.m is not OK, if C'.m is new, and C' is the witness.
a61af66fc99e Initial load
duke
parents:
diff changeset
931 if (changes != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
932 return find_witness_in(*changes, context_type, !participants_hide_witnesses);
a61af66fc99e Initial load
duke
parents:
diff changeset
933 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
934 return find_witness_anywhere(context_type, !participants_hide_witnesses);
a61af66fc99e Initial load
duke
parents:
diff changeset
935 }
a61af66fc99e Initial load
duke
parents:
diff changeset
936 }
a61af66fc99e Initial load
duke
parents:
diff changeset
937 };
a61af66fc99e Initial load
duke
parents:
diff changeset
938
a61af66fc99e Initial load
duke
parents:
diff changeset
939 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
940 static int deps_find_witness_calls = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
941 static int deps_find_witness_steps = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
942 static int deps_find_witness_recursions = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
943 static int deps_find_witness_singles = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
944 static int deps_find_witness_print = 0; // set to -1 to force a final print
a61af66fc99e Initial load
duke
parents:
diff changeset
945 static bool count_find_witness_calls() {
a61af66fc99e Initial load
duke
parents:
diff changeset
946 if (TraceDependencies || LogCompilation) {
a61af66fc99e Initial load
duke
parents:
diff changeset
947 int pcount = deps_find_witness_print + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
948 bool final_stats = (pcount == 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
949 bool initial_call = (pcount == 1);
a61af66fc99e Initial load
duke
parents:
diff changeset
950 bool occasional_print = ((pcount & ((1<<10) - 1)) == 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
951 if (pcount < 0) pcount = 1; // crude overflow protection
a61af66fc99e Initial load
duke
parents:
diff changeset
952 deps_find_witness_print = pcount;
a61af66fc99e Initial load
duke
parents:
diff changeset
953 if (VerifyDependencies && initial_call) {
a61af66fc99e Initial load
duke
parents:
diff changeset
954 tty->print_cr("Warning: TraceDependencies results may be inflated by VerifyDependencies");
a61af66fc99e Initial load
duke
parents:
diff changeset
955 }
a61af66fc99e Initial load
duke
parents:
diff changeset
956 if (occasional_print || final_stats) {
a61af66fc99e Initial load
duke
parents:
diff changeset
957 // Every now and then dump a little info about dependency searching.
a61af66fc99e Initial load
duke
parents:
diff changeset
958 if (xtty != NULL) {
1206
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1123
diff changeset
959 ttyLocker ttyl;
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1123
diff changeset
960 xtty->elem("deps_find_witness calls='%d' steps='%d' recursions='%d' singles='%d'",
0
a61af66fc99e Initial load
duke
parents:
diff changeset
961 deps_find_witness_calls,
a61af66fc99e Initial load
duke
parents:
diff changeset
962 deps_find_witness_steps,
a61af66fc99e Initial load
duke
parents:
diff changeset
963 deps_find_witness_recursions,
a61af66fc99e Initial load
duke
parents:
diff changeset
964 deps_find_witness_singles);
a61af66fc99e Initial load
duke
parents:
diff changeset
965 }
a61af66fc99e Initial load
duke
parents:
diff changeset
966 if (final_stats || (TraceDependencies && WizardMode)) {
1206
87684f1a88b5 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 1123
diff changeset
967 ttyLocker ttyl;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
968 tty->print_cr("Dependency check (find_witness) "
a61af66fc99e Initial load
duke
parents:
diff changeset
969 "calls=%d, steps=%d (avg=%.1f), recursions=%d, singles=%d",
a61af66fc99e Initial load
duke
parents:
diff changeset
970 deps_find_witness_calls,
a61af66fc99e Initial load
duke
parents:
diff changeset
971 deps_find_witness_steps,
a61af66fc99e Initial load
duke
parents:
diff changeset
972 (double)deps_find_witness_steps / deps_find_witness_calls,
a61af66fc99e Initial load
duke
parents:
diff changeset
973 deps_find_witness_recursions,
a61af66fc99e Initial load
duke
parents:
diff changeset
974 deps_find_witness_singles);
a61af66fc99e Initial load
duke
parents:
diff changeset
975 }
a61af66fc99e Initial load
duke
parents:
diff changeset
976 }
a61af66fc99e Initial load
duke
parents:
diff changeset
977 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
978 }
a61af66fc99e Initial load
duke
parents:
diff changeset
979 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
980 }
a61af66fc99e Initial load
duke
parents:
diff changeset
981 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
982 #define count_find_witness_calls() (0)
a61af66fc99e Initial load
duke
parents:
diff changeset
983 #endif //PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
984
a61af66fc99e Initial load
duke
parents:
diff changeset
985
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
986 Klass* ClassHierarchyWalker::find_witness_in(KlassDepChange& changes,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
987 Klass* context_type,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
988 bool participants_hide_witnesses) {
a61af66fc99e Initial load
duke
parents:
diff changeset
989 assert(changes.involves_context(context_type), "irrelevant dependency");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
990 Klass* new_type = changes.new_type();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
991
a61af66fc99e Initial load
duke
parents:
diff changeset
992 count_find_witness_calls();
a61af66fc99e Initial load
duke
parents:
diff changeset
993 NOT_PRODUCT(deps_find_witness_singles++);
a61af66fc99e Initial load
duke
parents:
diff changeset
994
a61af66fc99e Initial load
duke
parents:
diff changeset
995 // Current thread must be in VM (not native mode, as in CI):
a61af66fc99e Initial load
duke
parents:
diff changeset
996 assert(must_be_in_vm(), "raw oops here");
a61af66fc99e Initial load
duke
parents:
diff changeset
997 // Must not move the class hierarchy during this check:
a61af66fc99e Initial load
duke
parents:
diff changeset
998 assert_locked_or_safepoint(Compile_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
999
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1000 int nof_impls = InstanceKlass::cast(context_type)->nof_implementors();
30
65a06b4a51b8 6610906: inexplicable IncompatibleClassChangeError
jrose
parents: 0
diff changeset
1001 if (nof_impls > 1) {
65a06b4a51b8 6610906: inexplicable IncompatibleClassChangeError
jrose
parents: 0
diff changeset
1002 // Avoid this case: *I.m > { A.m, C }; B.m > C
65a06b4a51b8 6610906: inexplicable IncompatibleClassChangeError
jrose
parents: 0
diff changeset
1003 // %%% Until this is fixed more systematically, bail out.
65a06b4a51b8 6610906: inexplicable IncompatibleClassChangeError
jrose
parents: 0
diff changeset
1004 // See corresponding comment in find_witness_anywhere.
65a06b4a51b8 6610906: inexplicable IncompatibleClassChangeError
jrose
parents: 0
diff changeset
1005 return context_type;
65a06b4a51b8 6610906: inexplicable IncompatibleClassChangeError
jrose
parents: 0
diff changeset
1006 }
65a06b4a51b8 6610906: inexplicable IncompatibleClassChangeError
jrose
parents: 0
diff changeset
1007
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1008 assert(!is_participant(new_type), "only old classes are participants");
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 if (participants_hide_witnesses) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 // If the new type is a subtype of a participant, we are done.
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 for (int i = 0; i < num_participants(); i++) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1012 Klass* part = participant(i);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 if (part == NULL) continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 assert(changes.involves_context(part) == Klass::cast(new_type)->is_subtype_of(part),
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 "correct marking of participants, b/c new_type is unique");
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 if (changes.involves_context(part)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 // new guy is protected from this check by previous participant
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1022
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 if (is_witness(new_type) &&
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 !ignore_witness(new_type)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1025 return new_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1027
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1030
a61af66fc99e Initial load
duke
parents:
diff changeset
1031
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 // Walk hierarchy under a context type, looking for unexpected types.
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 // Do not report participant types, and recursively walk beneath
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 // them only if participants_hide_witnesses is false.
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 // If top_level_call is false, skip testing the context type,
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 // because the caller has already considered it.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1037 Klass* ClassHierarchyWalker::find_witness_anywhere(Klass* context_type,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 bool participants_hide_witnesses,
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 bool top_level_call) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 // Current thread must be in VM (not native mode, as in CI):
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 assert(must_be_in_vm(), "raw oops here");
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 // Must not move the class hierarchy during this check:
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 assert_locked_or_safepoint(Compile_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
1044
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 bool do_counts = count_find_witness_calls();
a61af66fc99e Initial load
duke
parents:
diff changeset
1046
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 // Check the root of the sub-hierarchy first.
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 if (top_level_call) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 if (do_counts) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 NOT_PRODUCT(deps_find_witness_calls++);
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 NOT_PRODUCT(deps_find_witness_steps++);
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 if (is_participant(context_type)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 if (participants_hide_witnesses) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1055 // else fall through to search loop...
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 } else if (is_witness(context_type) && !ignore_witness(context_type)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 // The context is an abstract class or interface, to start with.
a61af66fc99e Initial load
duke
parents:
diff changeset
1058 return context_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1060 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1061
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 // Now we must check each implementor and each subclass.
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 // Use a short worklist to avoid blowing the stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 // Each worklist entry is a *chain* of subklass siblings to process.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1065 const int CHAINMAX = 100; // >= 1 + InstanceKlass::implementors_limit
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 Klass* chains[CHAINMAX];
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 int chaini = 0; // index into worklist
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 Klass* chain; // scratch variable
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 #define ADD_SUBCLASS_CHAIN(k) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 assert(chaini < CHAINMAX, "oob"); \
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1071 chain = InstanceKlass::cast(k)->subklass(); \
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 if (chain != NULL) chains[chaini++] = chain; }
a61af66fc99e Initial load
duke
parents:
diff changeset
1073
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 // Look for non-abstract subclasses.
a61af66fc99e Initial load
duke
parents:
diff changeset
1075 // (Note: Interfaces do not have subclasses.)
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 ADD_SUBCLASS_CHAIN(context_type);
a61af66fc99e Initial load
duke
parents:
diff changeset
1077
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 // If it is an interface, search its direct implementors.
a61af66fc99e Initial load
duke
parents:
diff changeset
1079 // (Their subclasses are additional indirect implementors.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1080 // See InstanceKlass::add_implementor.)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 // (Note: nof_implementors is always zero for non-interfaces.)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1082 int nof_impls = InstanceKlass::cast(context_type)->nof_implementors();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 if (nof_impls > 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 // Avoid this case: *I.m > { A.m, C }; B.m > C
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 // Here, I.m has 2 concrete implementations, but m appears unique
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 // as A.m, because the search misses B.m when checking C.
a61af66fc99e Initial load
duke
parents:
diff changeset
1087 // The inherited method B.m was getting missed by the walker
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 // when interface 'I' was the starting point.
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 // %%% Until this is fixed more systematically, bail out.
a61af66fc99e Initial load
duke
parents:
diff changeset
1090 // (Old CHA had the same limitation.)
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 return context_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 }
5998
49036505ab5f 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 4772
diff changeset
1093 if (nof_impls > 0) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1094 Klass* impl = InstanceKlass::cast(context_type)->implementor();
5998
49036505ab5f 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 4772
diff changeset
1095 assert(impl != NULL, "just checking");
49036505ab5f 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 4772
diff changeset
1096 // If impl is the same as the context_type, then more than one
49036505ab5f 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 4772
diff changeset
1097 // implementor has seen. No exact info in this case.
49036505ab5f 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 4772
diff changeset
1098 if (impl == context_type) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1099 return context_type; // report an inexact witness to this sad affair
a61af66fc99e Initial load
duke
parents:
diff changeset
1100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 if (do_counts)
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 { NOT_PRODUCT(deps_find_witness_steps++); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 if (is_participant(impl)) {
5998
49036505ab5f 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 4772
diff changeset
1104 if (!participants_hide_witnesses) {
49036505ab5f 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 4772
diff changeset
1105 ADD_SUBCLASS_CHAIN(impl);
49036505ab5f 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 4772
diff changeset
1106 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1107 } else if (is_witness(impl) && !ignore_witness(impl)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 return impl;
5998
49036505ab5f 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 4772
diff changeset
1109 } else {
49036505ab5f 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 4772
diff changeset
1110 ADD_SUBCLASS_CHAIN(impl);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1113
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 // Recursively process each non-trivial sibling chain.
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 while (chaini > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 Klass* chain = chains[--chaini];
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1117 for (Klass* sub = chain; sub != NULL; sub = sub->next_sibling()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 if (do_counts) { NOT_PRODUCT(deps_find_witness_steps++); }
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 if (is_participant(sub)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 if (participants_hide_witnesses) continue;
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 // else fall through to process this guy's subclasses
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 } else if (is_witness(sub) && !ignore_witness(sub)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 return sub;
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 if (chaini < (VerifyDependencies? 2: CHAINMAX)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 // Fast path. (Partially disabled if VerifyDependencies.)
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 ADD_SUBCLASS_CHAIN(sub);
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 // Worklist overflow. Do a recursive call. Should be rare.
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 // The recursive call will have its own worklist, of course.
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 // (Note that sub has already been tested, so that there is
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 // no need for the recursive call to re-test. That's handy,
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 // since the recursive call sees sub as the context_type.)
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 if (do_counts) { NOT_PRODUCT(deps_find_witness_recursions++); }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1135 Klass* witness = find_witness_anywhere(sub,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 participants_hide_witnesses,
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 /*top_level_call=*/ false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 if (witness != NULL) return witness;
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1142
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 // No witness found. The dependency remains unbroken.
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 #undef ADD_SUBCLASS_CHAIN
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1147
a61af66fc99e Initial load
duke
parents:
diff changeset
1148
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1149 bool Dependencies::is_concrete_klass(Klass* k) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 if (Klass::cast(k)->is_abstract()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 // %%% We could treat classes which are concrete but
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 // have not yet been instantiated as virtually abstract.
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 // This would require a deoptimization barrier on first instantiation.
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 //if (k->is_not_instantiated()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1157
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1158 bool Dependencies::is_concrete_method(Method* m) {
4060
c9a03402fe56 7105305: assert check_method_context proper context
never
parents: 3894
diff changeset
1159 // Statics are irrelevant to virtual call sites.
c9a03402fe56 7105305: assert check_method_context proper context
never
parents: 3894
diff changeset
1160 if (m->is_static()) return false;
c9a03402fe56 7105305: assert check_method_context proper context
never
parents: 3894
diff changeset
1161
c9a03402fe56 7105305: assert check_method_context proper context
never
parents: 3894
diff changeset
1162 // We could also return false if m does not yet appear to be
c9a03402fe56 7105305: assert check_method_context proper context
never
parents: 3894
diff changeset
1163 // executed, if the VM version supports this distinction also.
6934
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6844
diff changeset
1164 return !m->is_abstract() &&
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6844
diff changeset
1165 !InstanceKlass::cast(m->method_holder())->is_interface();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6844
diff changeset
1166 // TODO: investigate whether default methods should be
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6844
diff changeset
1167 // considered as "concrete" in this situation. For now they
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6844
diff changeset
1168 // are not.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1170
a61af66fc99e Initial load
duke
parents:
diff changeset
1171
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 Klass* Dependencies::find_finalizable_subclass(Klass* k) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1173 if (k->is_interface()) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1174 if (k->has_finalizer()) return k;
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 k = k->subklass();
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 while (k != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 Klass* result = find_finalizable_subclass(k);
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 if (result != NULL) return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
1179 k = k->next_sibling();
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1183
a61af66fc99e Initial load
duke
parents:
diff changeset
1184
a61af66fc99e Initial load
duke
parents:
diff changeset
1185 bool Dependencies::is_concrete_klass(ciInstanceKlass* k) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 if (k->is_abstract()) return false;
4060
c9a03402fe56 7105305: assert check_method_context proper context
never
parents: 3894
diff changeset
1187 // We could also return false if k does not yet appear to be
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 // instantiated, if the VM version supports this distinction also.
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 //if (k->is_not_instantiated()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1192
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 bool Dependencies::is_concrete_method(ciMethod* m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 // Statics are irrelevant to virtual call sites.
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 if (m->is_static()) return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1196
4060
c9a03402fe56 7105305: assert check_method_context proper context
never
parents: 3894
diff changeset
1197 // We could also return false if m does not yet appear to be
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1198 // executed, if the VM version supports this distinction also.
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 return !m->is_abstract();
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1201
a61af66fc99e Initial load
duke
parents:
diff changeset
1202
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 bool Dependencies::has_finalizable_subclass(ciInstanceKlass* k) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1204 return k->has_finalizable_subclass();
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1206
a61af66fc99e Initial load
duke
parents:
diff changeset
1207
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 // Any use of the contents (bytecodes) of a method must be
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 // marked by an "evol_method" dependency, if those contents
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 // can change. (Note: A method is always dependent on itself.)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1211 Klass* Dependencies::check_evol_method(Method* m) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 assert(must_be_in_vm(), "raw oops here");
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 // Did somebody do a JVMTI RedefineClasses while our backs were turned?
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 // Or is there a now a breakpoint?
a61af66fc99e Initial load
duke
parents:
diff changeset
1215 // (Assumes compiled code cannot handle bkpts; change if UseFastBreakpoints.)
a61af66fc99e Initial load
duke
parents:
diff changeset
1216 if (m->is_old()
a61af66fc99e Initial load
duke
parents:
diff changeset
1217 || m->number_of_breakpoints() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 return m->method_holder();
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1220 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1221 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1222 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1223
a61af66fc99e Initial load
duke
parents:
diff changeset
1224 // This is a strong assertion: It is that the given type
a61af66fc99e Initial load
duke
parents:
diff changeset
1225 // has no subtypes whatever. It is most useful for
a61af66fc99e Initial load
duke
parents:
diff changeset
1226 // optimizing checks on reflected types or on array types.
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 // (Checks on types which are derived from real instances
a61af66fc99e Initial load
duke
parents:
diff changeset
1228 // can be optimized more strongly than this, because we
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 // know that the checked type comes from a concrete type,
a61af66fc99e Initial load
duke
parents:
diff changeset
1230 // and therefore we can disregard abstract types.)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1231 Klass* Dependencies::check_leaf_type(Klass* ctxk) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 assert(must_be_in_vm(), "raw oops here");
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 assert_locked_or_safepoint(Compile_lock);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1234 InstanceKlass* ctx = InstanceKlass::cast(ctxk);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1235 Klass* sub = ctx->subklass();
a61af66fc99e Initial load
duke
parents:
diff changeset
1236 if (sub != NULL) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1237 return sub;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1238 } else if (ctx->nof_implementors() != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1239 // if it is an interface, it must be unimplemented
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 // (if it is not an interface, nof_implementors is always zero)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1241 Klass* impl = ctx->implementor();
5998
49036505ab5f 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 4772
diff changeset
1242 assert(impl != NULL, "must be set");
49036505ab5f 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 4772
diff changeset
1243 return impl;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1245 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1246 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1247 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1248
a61af66fc99e Initial load
duke
parents:
diff changeset
1249 // Test the assertion that conck is the only concrete subtype* of ctxk.
a61af66fc99e Initial load
duke
parents:
diff changeset
1250 // The type conck itself is allowed to have have further concrete subtypes.
a61af66fc99e Initial load
duke
parents:
diff changeset
1251 // This allows the compiler to narrow occurrences of ctxk by conck,
a61af66fc99e Initial load
duke
parents:
diff changeset
1252 // when dealing with the types of actual instances.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1253 Klass* Dependencies::check_abstract_with_unique_concrete_subtype(Klass* ctxk,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1254 Klass* conck,
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1255 KlassDepChange* changes) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1256 ClassHierarchyWalker wf(conck);
a61af66fc99e Initial load
duke
parents:
diff changeset
1257 return wf.find_witness_subtype(ctxk, changes);
a61af66fc99e Initial load
duke
parents:
diff changeset
1258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1259
a61af66fc99e Initial load
duke
parents:
diff changeset
1260 // If a non-concrete class has no concrete subtypes, it is not (yet)
a61af66fc99e Initial load
duke
parents:
diff changeset
1261 // instantiatable. This can allow the compiler to make some paths go
a61af66fc99e Initial load
duke
parents:
diff changeset
1262 // dead, if they are gated by a test of the type.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1263 Klass* Dependencies::check_abstract_with_no_concrete_subtype(Klass* ctxk,
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1264 KlassDepChange* changes) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1265 // Find any concrete subtype, with no participants:
a61af66fc99e Initial load
duke
parents:
diff changeset
1266 ClassHierarchyWalker wf;
a61af66fc99e Initial load
duke
parents:
diff changeset
1267 return wf.find_witness_subtype(ctxk, changes);
a61af66fc99e Initial load
duke
parents:
diff changeset
1268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1269
a61af66fc99e Initial load
duke
parents:
diff changeset
1270
a61af66fc99e Initial load
duke
parents:
diff changeset
1271 // If a concrete class has no concrete subtypes, it can always be
a61af66fc99e Initial load
duke
parents:
diff changeset
1272 // exactly typed. This allows the use of a cheaper type test.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1273 Klass* Dependencies::check_concrete_with_no_concrete_subtype(Klass* ctxk,
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1274 KlassDepChange* changes) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 // Find any concrete subtype, with only the ctxk as participant:
a61af66fc99e Initial load
duke
parents:
diff changeset
1276 ClassHierarchyWalker wf(ctxk);
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 return wf.find_witness_subtype(ctxk, changes);
a61af66fc99e Initial load
duke
parents:
diff changeset
1278 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1279
a61af66fc99e Initial load
duke
parents:
diff changeset
1280
a61af66fc99e Initial load
duke
parents:
diff changeset
1281 // Find the unique concrete proper subtype of ctxk, or NULL if there
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 // is more than one concrete proper subtype. If there are no concrete
a61af66fc99e Initial load
duke
parents:
diff changeset
1283 // proper subtypes, return ctxk itself, whether it is concrete or not.
a61af66fc99e Initial load
duke
parents:
diff changeset
1284 // The returned subtype is allowed to have have further concrete subtypes.
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 // That is, return CC1 for CX > CC1 > CC2, but NULL for CX > { CC1, CC2 }.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1286 Klass* Dependencies::find_unique_concrete_subtype(Klass* ctxk) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1287 ClassHierarchyWalker wf(ctxk); // Ignore ctxk when walking.
a61af66fc99e Initial load
duke
parents:
diff changeset
1288 wf.record_witnesses(1); // Record one other witness when walking.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1289 Klass* wit = wf.find_witness_subtype(ctxk);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1290 if (wit != NULL) return NULL; // Too many witnesses.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1291 Klass* conck = wf.participant(0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1292 if (conck == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1293 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1294 // Make sure the dependency mechanism will pass this discovery:
a61af66fc99e Initial load
duke
parents:
diff changeset
1295 if (VerifyDependencies) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1296 // Turn off dependency tracing while actually testing deps.
a61af66fc99e Initial load
duke
parents:
diff changeset
1297 FlagSetting fs(TraceDependencies, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1298 if (!Dependencies::is_concrete_klass(ctxk)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1299 guarantee(NULL ==
a61af66fc99e Initial load
duke
parents:
diff changeset
1300 (void *)check_abstract_with_no_concrete_subtype(ctxk),
a61af66fc99e Initial load
duke
parents:
diff changeset
1301 "verify dep.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1302 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 guarantee(NULL ==
a61af66fc99e Initial load
duke
parents:
diff changeset
1304 (void *)check_concrete_with_no_concrete_subtype(ctxk),
a61af66fc99e Initial load
duke
parents:
diff changeset
1305 "verify dep.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1306 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1307 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1308 #endif //PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1309 return ctxk; // Return ctxk as a flag for "no subtypes".
a61af66fc99e Initial load
duke
parents:
diff changeset
1310 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1311 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 // Make sure the dependency mechanism will pass this discovery:
a61af66fc99e Initial load
duke
parents:
diff changeset
1313 if (VerifyDependencies) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1314 // Turn off dependency tracing while actually testing deps.
a61af66fc99e Initial load
duke
parents:
diff changeset
1315 FlagSetting fs(TraceDependencies, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1316 if (!Dependencies::is_concrete_klass(ctxk)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1317 guarantee(NULL == (void *)
a61af66fc99e Initial load
duke
parents:
diff changeset
1318 check_abstract_with_unique_concrete_subtype(ctxk, conck),
a61af66fc99e Initial load
duke
parents:
diff changeset
1319 "verify dep.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1320 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1321 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1322 #endif //PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1323 return conck;
a61af66fc99e Initial load
duke
parents:
diff changeset
1324 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1325 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1326
a61af66fc99e Initial load
duke
parents:
diff changeset
1327 // Test the assertion that the k[12] are the only concrete subtypes of ctxk,
a61af66fc99e Initial load
duke
parents:
diff changeset
1328 // except possibly for further subtypes of k[12] themselves.
a61af66fc99e Initial load
duke
parents:
diff changeset
1329 // The context type must be abstract. The types k1 and k2 are themselves
a61af66fc99e Initial load
duke
parents:
diff changeset
1330 // allowed to have further concrete subtypes.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1331 Klass* Dependencies::check_abstract_with_exclusive_concrete_subtypes(
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1332 Klass* ctxk,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1333 Klass* k1,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1334 Klass* k2,
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1335 KlassDepChange* changes) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1336 ClassHierarchyWalker wf;
a61af66fc99e Initial load
duke
parents:
diff changeset
1337 wf.add_participant(k1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1338 wf.add_participant(k2);
a61af66fc99e Initial load
duke
parents:
diff changeset
1339 return wf.find_witness_subtype(ctxk, changes);
a61af66fc99e Initial load
duke
parents:
diff changeset
1340 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1341
a61af66fc99e Initial load
duke
parents:
diff changeset
1342 // Search ctxk for concrete implementations. If there are klen or fewer,
a61af66fc99e Initial load
duke
parents:
diff changeset
1343 // pack them into the given array and return the number.
a61af66fc99e Initial load
duke
parents:
diff changeset
1344 // Otherwise, return -1, meaning the given array would overflow.
a61af66fc99e Initial load
duke
parents:
diff changeset
1345 // (Note that a return of 0 means there are exactly no concrete subtypes.)
a61af66fc99e Initial load
duke
parents:
diff changeset
1346 // In this search, if ctxk is concrete, it will be reported alone.
a61af66fc99e Initial load
duke
parents:
diff changeset
1347 // For any type CC reported, no proper subtypes of CC will be reported.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1348 int Dependencies::find_exclusive_concrete_subtypes(Klass* ctxk,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 int klen,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1350 Klass* karray[]) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 ClassHierarchyWalker wf;
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 wf.record_witnesses(klen);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1353 Klass* wit = wf.find_witness_subtype(ctxk);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1354 if (wit != NULL) return -1; // Too many witnesses.
a61af66fc99e Initial load
duke
parents:
diff changeset
1355 int num = wf.num_participants();
a61af66fc99e Initial load
duke
parents:
diff changeset
1356 assert(num <= klen, "oob");
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 // Pack the result array with the good news.
a61af66fc99e Initial load
duke
parents:
diff changeset
1358 for (int i = 0; i < num; i++)
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 karray[i] = wf.participant(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
1360 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1361 // Make sure the dependency mechanism will pass this discovery:
a61af66fc99e Initial load
duke
parents:
diff changeset
1362 if (VerifyDependencies) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 // Turn off dependency tracing while actually testing deps.
a61af66fc99e Initial load
duke
parents:
diff changeset
1364 FlagSetting fs(TraceDependencies, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 switch (Dependencies::is_concrete_klass(ctxk)? -1: num) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1366 case -1: // ctxk was itself concrete
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 guarantee(num == 1 && karray[0] == ctxk, "verify dep.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 case 0:
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 guarantee(NULL == (void *)check_abstract_with_no_concrete_subtype(ctxk),
a61af66fc99e Initial load
duke
parents:
diff changeset
1371 "verify dep.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 case 1:
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 guarantee(NULL == (void *)
a61af66fc99e Initial load
duke
parents:
diff changeset
1375 check_abstract_with_unique_concrete_subtype(ctxk, karray[0]),
a61af66fc99e Initial load
duke
parents:
diff changeset
1376 "verify dep.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 case 2:
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 guarantee(NULL == (void *)
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 check_abstract_with_exclusive_concrete_subtypes(ctxk,
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 karray[0],
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 karray[1]),
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 "verify dep.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 ShouldNotReachHere(); // klen > 2 yet supported
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1388 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 #endif //PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 return num;
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1392
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 // If a class (or interface) has a unique concrete method uniqm, return NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 // Otherwise, return a class that contains an interfering method.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1395 Klass* Dependencies::check_unique_concrete_method(Klass* ctxk, Method* uniqm,
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1396 KlassDepChange* changes) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 // Here is a missing optimization: If uniqm->is_final(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1398 // we don't really need to search beneath it for overrides.
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 // This is probably not important, since we don't use dependencies
a61af66fc99e Initial load
duke
parents:
diff changeset
1400 // to track final methods. (They can't be "definalized".)
a61af66fc99e Initial load
duke
parents:
diff changeset
1401 ClassHierarchyWalker wf(uniqm->method_holder(), uniqm);
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 return wf.find_witness_definer(ctxk, changes);
a61af66fc99e Initial load
duke
parents:
diff changeset
1403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1404
a61af66fc99e Initial load
duke
parents:
diff changeset
1405 // Find the set of all non-abstract methods under ctxk that match m.
a61af66fc99e Initial load
duke
parents:
diff changeset
1406 // (The method m must be defined or inherited in ctxk.)
a61af66fc99e Initial load
duke
parents:
diff changeset
1407 // Include m itself in the set, unless it is abstract.
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 // If this set has exactly one element, return that element.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1409 Method* Dependencies::find_unique_concrete_method(Klass* ctxk, Method* m) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1410 ClassHierarchyWalker wf(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
1411 assert(wf.check_method_context(ctxk, m), "proper context");
a61af66fc99e Initial load
duke
parents:
diff changeset
1412 wf.record_witnesses(1);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1413 Klass* wit = wf.find_witness_definer(ctxk);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1414 if (wit != NULL) return NULL; // Too many witnesses.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1415 Method* fm = wf.found_method(0); // Will be NULL if num_parts == 0.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1416 if (Dependencies::is_concrete_method(m)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1417 if (fm == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1418 // It turns out that m was always the only implementation.
a61af66fc99e Initial load
duke
parents:
diff changeset
1419 fm = m;
a61af66fc99e Initial load
duke
parents:
diff changeset
1420 } else if (fm != m) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1421 // Two conflicting implementations after all.
a61af66fc99e Initial load
duke
parents:
diff changeset
1422 // (This can happen if m is inherited into ctxk and fm overrides it.)
a61af66fc99e Initial load
duke
parents:
diff changeset
1423 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1424 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1425 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1426 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1427 // Make sure the dependency mechanism will pass this discovery:
a61af66fc99e Initial load
duke
parents:
diff changeset
1428 if (VerifyDependencies && fm != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1429 guarantee(NULL == (void *)check_unique_concrete_method(ctxk, fm),
a61af66fc99e Initial load
duke
parents:
diff changeset
1430 "verify dep.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1431 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1432 #endif //PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1433 return fm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1435
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1436 Klass* Dependencies::check_exclusive_concrete_methods(Klass* ctxk,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1437 Method* m1,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1438 Method* m2,
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1439 KlassDepChange* changes) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1440 ClassHierarchyWalker wf(m1);
a61af66fc99e Initial load
duke
parents:
diff changeset
1441 wf.add_participant(m1->method_holder());
a61af66fc99e Initial load
duke
parents:
diff changeset
1442 wf.add_participant(m2->method_holder());
a61af66fc99e Initial load
duke
parents:
diff changeset
1443 return wf.find_witness_definer(ctxk, changes);
a61af66fc99e Initial load
duke
parents:
diff changeset
1444 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1445
a61af66fc99e Initial load
duke
parents:
diff changeset
1446 // Find the set of all non-abstract methods under ctxk that match m[0].
a61af66fc99e Initial load
duke
parents:
diff changeset
1447 // (The method m[0] must be defined or inherited in ctxk.)
a61af66fc99e Initial load
duke
parents:
diff changeset
1448 // Include m itself in the set, unless it is abstract.
a61af66fc99e Initial load
duke
parents:
diff changeset
1449 // Fill the given array m[0..(mlen-1)] with this set, and return the length.
a61af66fc99e Initial load
duke
parents:
diff changeset
1450 // (The length may be zero if no concrete methods are found anywhere.)
a61af66fc99e Initial load
duke
parents:
diff changeset
1451 // If there are too many concrete methods to fit in marray, return -1.
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1452 int Dependencies::find_exclusive_concrete_methods(Klass* ctxk,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1453 int mlen,
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1454 Method* marray[]) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1455 Method* m0 = marray[0];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1456 ClassHierarchyWalker wf(m0);
a61af66fc99e Initial load
duke
parents:
diff changeset
1457 assert(wf.check_method_context(ctxk, m0), "proper context");
a61af66fc99e Initial load
duke
parents:
diff changeset
1458 wf.record_witnesses(mlen);
a61af66fc99e Initial load
duke
parents:
diff changeset
1459 bool participants_hide_witnesses = true;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1460 Klass* wit = wf.find_witness_definer(ctxk);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1461 if (wit != NULL) return -1; // Too many witnesses.
a61af66fc99e Initial load
duke
parents:
diff changeset
1462 int num = wf.num_participants();
a61af66fc99e Initial load
duke
parents:
diff changeset
1463 assert(num <= mlen, "oob");
a61af66fc99e Initial load
duke
parents:
diff changeset
1464 // Keep track of whether m is also part of the result set.
a61af66fc99e Initial load
duke
parents:
diff changeset
1465 int mfill = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1466 assert(marray[mfill] == m0, "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
1467 if (Dependencies::is_concrete_method(m0))
a61af66fc99e Initial load
duke
parents:
diff changeset
1468 mfill++; // keep m0 as marray[0], the first result
a61af66fc99e Initial load
duke
parents:
diff changeset
1469 for (int i = 0; i < num; i++) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1470 Method* fm = wf.found_method(i);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1471 if (fm == m0) continue; // Already put this guy in the list.
a61af66fc99e Initial load
duke
parents:
diff changeset
1472 if (mfill == mlen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1473 return -1; // Oops. Too many methods after all!
a61af66fc99e Initial load
duke
parents:
diff changeset
1474 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1475 marray[mfill++] = fm;
a61af66fc99e Initial load
duke
parents:
diff changeset
1476 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1477 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1478 // Make sure the dependency mechanism will pass this discovery:
a61af66fc99e Initial load
duke
parents:
diff changeset
1479 if (VerifyDependencies) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1480 // Turn off dependency tracing while actually testing deps.
a61af66fc99e Initial load
duke
parents:
diff changeset
1481 FlagSetting fs(TraceDependencies, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
1482 switch (mfill) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1483 case 1:
a61af66fc99e Initial load
duke
parents:
diff changeset
1484 guarantee(NULL == (void *)check_unique_concrete_method(ctxk, marray[0]),
a61af66fc99e Initial load
duke
parents:
diff changeset
1485 "verify dep.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1486 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1487 case 2:
a61af66fc99e Initial load
duke
parents:
diff changeset
1488 guarantee(NULL == (void *)
a61af66fc99e Initial load
duke
parents:
diff changeset
1489 check_exclusive_concrete_methods(ctxk, marray[0], marray[1]),
a61af66fc99e Initial load
duke
parents:
diff changeset
1490 "verify dep.");
a61af66fc99e Initial load
duke
parents:
diff changeset
1491 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1492 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1493 ShouldNotReachHere(); // mlen > 2 yet supported
a61af66fc99e Initial load
duke
parents:
diff changeset
1494 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1495 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1496 #endif //PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1497 return mfill;
a61af66fc99e Initial load
duke
parents:
diff changeset
1498 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1499
a61af66fc99e Initial load
duke
parents:
diff changeset
1500
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1501 Klass* Dependencies::check_has_no_finalizable_subclasses(Klass* ctxk, KlassDepChange* changes) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1502 Klass* search_at = ctxk;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1503 if (changes != NULL)
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1504 search_at = changes->new_type(); // just look at the new bit
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1505 return find_finalizable_subclass(search_at);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1506 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1507
a61af66fc99e Initial load
duke
parents:
diff changeset
1508
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1509 Klass* Dependencies::check_call_site_target_value(oop call_site, oop method_handle, CallSiteDepChange* changes) {
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1510 assert(call_site ->is_a(SystemDictionary::CallSite_klass()), "sanity");
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1511 assert(method_handle->is_a(SystemDictionary::MethodHandle_klass()), "sanity");
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1512 if (changes == NULL) {
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1513 // Validate all CallSites
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1514 if (java_lang_invoke_CallSite::target(call_site) != method_handle)
3894
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
1515 return call_site->klass(); // assertion failed
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1516 } else {
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1517 // Validate the given CallSite
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1518 if (call_site == changes->call_site() && java_lang_invoke_CallSite::target(call_site) != changes->method_handle()) {
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1519 assert(method_handle != changes->method_handle(), "must be");
3894
b27c72d69fd1 7083184: JSR 292: don't store context class argument with call site dependencies
twisti
parents: 3852
diff changeset
1520 return call_site->klass(); // assertion failed
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1521 }
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1522 }
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1523 return NULL; // assertion still valid
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1524 }
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1525
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1526
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1527 void Dependencies::DepStream::trace_and_log_witness(Klass* witness) {
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1528 if (witness != NULL) {
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1529 if (TraceDependencies) {
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1530 print_dependency(witness, /*verbose=*/ true);
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1531 }
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1532 // The following is a no-op unless logging is enabled:
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1533 log_dependency(witness);
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1534 }
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1535 }
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1536
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1537
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1538 Klass* Dependencies::DepStream::check_klass_dependency(KlassDepChange* changes) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1539 assert_locked_or_safepoint(Compile_lock);
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1540 Dependencies::check_valid_dependency_type(type());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1541
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1542 Klass* witness = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1543 switch (type()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1544 case evol_method:
a61af66fc99e Initial load
duke
parents:
diff changeset
1545 witness = check_evol_method(method_argument(0));
a61af66fc99e Initial load
duke
parents:
diff changeset
1546 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1547 case leaf_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
1548 witness = check_leaf_type(context_type());
a61af66fc99e Initial load
duke
parents:
diff changeset
1549 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1550 case abstract_with_unique_concrete_subtype:
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1551 witness = check_abstract_with_unique_concrete_subtype(context_type(), type_argument(1), changes);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1552 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1553 case abstract_with_no_concrete_subtype:
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1554 witness = check_abstract_with_no_concrete_subtype(context_type(), changes);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1555 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1556 case concrete_with_no_concrete_subtype:
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1557 witness = check_concrete_with_no_concrete_subtype(context_type(), changes);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1558 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1559 case unique_concrete_method:
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1560 witness = check_unique_concrete_method(context_type(), method_argument(1), changes);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1561 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1562 case abstract_with_exclusive_concrete_subtypes_2:
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1563 witness = check_abstract_with_exclusive_concrete_subtypes(context_type(), type_argument(1), type_argument(2), changes);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1564 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1565 case exclusive_concrete_methods_2:
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1566 witness = check_exclusive_concrete_methods(context_type(), method_argument(1), method_argument(2), changes);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1567 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1568 case no_finalizable_subclasses:
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1569 witness = check_has_no_finalizable_subclasses(context_type(), changes);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1570 break;
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1571 default:
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1572 witness = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1573 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1574 }
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1575 trace_and_log_witness(witness);
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1576 return witness;
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1577 }
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1578
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1579
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1580 Klass* Dependencies::DepStream::check_call_site_dependency(CallSiteDepChange* changes) {
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1581 assert_locked_or_safepoint(Compile_lock);
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1582 Dependencies::check_valid_dependency_type(type());
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1583
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1584 Klass* witness = NULL;
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1585 switch (type()) {
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1586 case call_site_target_value:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1587 witness = check_call_site_target_value(argument_oop(0), argument_oop(1), changes);
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1588 break;
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1589 default:
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1590 witness = NULL;
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1591 break;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1592 }
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1593 trace_and_log_witness(witness);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1594 return witness;
a61af66fc99e Initial load
duke
parents:
diff changeset
1595 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1596
a61af66fc99e Initial load
duke
parents:
diff changeset
1597
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1598 Klass* Dependencies::DepStream::spot_check_dependency_at(DepChange& changes) {
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1599 // Handle klass dependency
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1600 if (changes.is_klass_change() && changes.as_klass_change()->involves_context(context_type()))
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1601 return check_klass_dependency(changes.as_klass_change());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1602
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1603 // Handle CallSite dependency
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1604 if (changes.is_call_site_change())
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1605 return check_call_site_dependency(changes.as_call_site_change());
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1606
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1607 // irrelevant dependency; skip it
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1608 return NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1609 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1610
a61af66fc99e Initial load
duke
parents:
diff changeset
1611
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1612 void DepChange::print() {
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1613 int nsup = 0, nint = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1614 for (ContextStream str(*this); str.next(); ) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1615 Klass* k = str.klass();
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1616 switch (str.change_type()) {
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1617 case Change_new_type:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1618 tty->print_cr(" dependee = %s", InstanceKlass::cast(k)->external_name());
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1619 break;
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1620 case Change_new_sub:
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1621 if (!WizardMode) {
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1622 ++nsup;
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1623 } else {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1624 tty->print_cr(" context super = %s", InstanceKlass::cast(k)->external_name());
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1625 }
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1626 break;
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1627 case Change_new_impl:
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1628 if (!WizardMode) {
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1629 ++nint;
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1630 } else {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1631 tty->print_cr(" context interface = %s", InstanceKlass::cast(k)->external_name());
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1632 }
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1633 break;
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1634 }
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1635 }
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1636 if (nsup + nint != 0) {
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1637 tty->print_cr(" context supers = %d, interfaces = %d", nsup, nint);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1638 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1639 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1640
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1641 void DepChange::ContextStream::start() {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1642 Klass* new_type = _changes.is_klass_change() ? _changes.as_klass_change()->new_type() : (Klass*) NULL;
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1643 _change_type = (new_type == NULL ? NO_CHANGE : Start_Klass);
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1644 _klass = new_type;
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1645 _ti_base = NULL;
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1646 _ti_index = 0;
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1647 _ti_limit = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1648 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1649
a61af66fc99e Initial load
duke
parents:
diff changeset
1650 bool DepChange::ContextStream::next() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1651 switch (_change_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1652 case Start_Klass: // initial state; _klass is the new type
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1653 _ti_base = InstanceKlass::cast(_klass)->transitive_interfaces();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1654 _ti_index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
1655 _change_type = Change_new_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
1656 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1657 case Change_new_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
1658 // fall through:
a61af66fc99e Initial load
duke
parents:
diff changeset
1659 _change_type = Change_new_sub;
a61af66fc99e Initial load
duke
parents:
diff changeset
1660 case Change_new_sub:
54
d4a0f561287a 6598190: JPRT tests fail when run with -XX:+CheckUnhandledOops
sbohne
parents: 0
diff changeset
1661 // 6598190: brackets workaround Sun Studio C++ compiler bug 6629277
d4a0f561287a 6598190: JPRT tests fail when run with -XX:+CheckUnhandledOops
sbohne
parents: 0
diff changeset
1662 {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1663 _klass = InstanceKlass::cast(_klass)->super();
54
d4a0f561287a 6598190: JPRT tests fail when run with -XX:+CheckUnhandledOops
sbohne
parents: 0
diff changeset
1664 if (_klass != NULL) {
d4a0f561287a 6598190: JPRT tests fail when run with -XX:+CheckUnhandledOops
sbohne
parents: 0
diff changeset
1665 return true;
d4a0f561287a 6598190: JPRT tests fail when run with -XX:+CheckUnhandledOops
sbohne
parents: 0
diff changeset
1666 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1667 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1668 // else set up _ti_limit and fall through:
a61af66fc99e Initial load
duke
parents:
diff changeset
1669 _ti_limit = (_ti_base == NULL) ? 0 : _ti_base->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
1670 _change_type = Change_new_impl;
a61af66fc99e Initial load
duke
parents:
diff changeset
1671 case Change_new_impl:
a61af66fc99e Initial load
duke
parents:
diff changeset
1672 if (_ti_index < _ti_limit) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1673 _klass = _ti_base->at(_ti_index++);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1674 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1675 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1676 // fall through:
a61af66fc99e Initial load
duke
parents:
diff changeset
1677 _change_type = NO_CHANGE; // iterator is exhausted
a61af66fc99e Initial load
duke
parents:
diff changeset
1678 case NO_CHANGE:
a61af66fc99e Initial load
duke
parents:
diff changeset
1679 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1680 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1681 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
1682 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1683 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1684 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1685
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1686 void KlassDepChange::initialize() {
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1687 // entire transaction must be under this lock:
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1688 assert_lock_strong(Compile_lock);
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1689
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1690 // Mark all dependee and all its superclasses
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1691 // Mark transitive interfaces
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1692 for (ContextStream str(*this); str.next(); ) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1693 Klass* d = str.klass();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1694 assert(!InstanceKlass::cast(d)->is_marked_dependent(), "checking");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1695 InstanceKlass::cast(d)->set_is_marked_dependent(true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1696 }
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1697 }
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1698
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1699 KlassDepChange::~KlassDepChange() {
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1700 // Unmark all dependee and all its superclasses
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1701 // Unmark transitive interfaces
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1702 for (ContextStream str(*this); str.next(); ) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1703 Klass* d = str.klass();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1704 InstanceKlass::cast(d)->set_is_marked_dependent(false);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1705 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1706 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1707
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1708 bool KlassDepChange::involves_context(Klass* k) {
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1709 if (k == NULL || !Klass::cast(k)->oop_is_instance()) {
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1710 return false;
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1711 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 5998
diff changeset
1712 InstanceKlass* ik = InstanceKlass::cast(k);
3852
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1713 bool is_contained = ik->is_marked_dependent();
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1714 assert(is_contained == Klass::cast(new_type())->is_subtype_of(k),
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1715 "correct marking of potential context types");
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1716 return is_contained;
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1717 }
fdb992d83a87 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 2426
diff changeset
1718
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1719 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1720 void Dependencies::print_statistics() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1721 if (deps_find_witness_print != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1722 // Call one final time, to flush out the data.
a61af66fc99e Initial load
duke
parents:
diff changeset
1723 deps_find_witness_print = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1724 count_find_witness_calls();
a61af66fc99e Initial load
duke
parents:
diff changeset
1725 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1726 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1727 #endif