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