src/share/vm/code/dependencies.cpp

Mon, 12 Nov 2012 14:03:53 -0800

author
minqi
date
Mon, 12 Nov 2012 14:03:53 -0800
changeset 4267
bd7a7ce2e264
parent 4251
18fb7da42534
child 4280
80e866b1d053
permissions
-rw-r--r--

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

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

mercurial