| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 10349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10360 } else if (RelocInfo::IsCodeTarget(mode)) { | 10360 } else if (RelocInfo::IsCodeTarget(mode)) { |
| 10361 // rewrite code handles in inline cache targets to direct | 10361 // rewrite code handles in inline cache targets to direct |
| 10362 // pointers to the first instruction in the code object | 10362 // pointers to the first instruction in the code object |
| 10363 Handle<Object> p = it.rinfo()->target_object_handle(origin); | 10363 Handle<Object> p = it.rinfo()->target_object_handle(origin); |
| 10364 Code* code = Code::cast(*p); | 10364 Code* code = Code::cast(*p); |
| 10365 it.rinfo()->set_target_address(code->instruction_start(), | 10365 it.rinfo()->set_target_address(code->instruction_start(), |
| 10366 SKIP_WRITE_BARRIER); | 10366 SKIP_WRITE_BARRIER); |
| 10367 } else if (RelocInfo::IsRuntimeEntry(mode)) { | 10367 } else if (RelocInfo::IsRuntimeEntry(mode)) { |
| 10368 Address p = it.rinfo()->target_runtime_entry(origin); | 10368 Address p = it.rinfo()->target_runtime_entry(origin); |
| 10369 it.rinfo()->set_target_runtime_entry(p, SKIP_WRITE_BARRIER); | 10369 it.rinfo()->set_target_runtime_entry(p, SKIP_WRITE_BARRIER); |
| 10370 } else if (mode == RelocInfo::CODE_AGE_SEQUENCE) { |
| 10371 Handle<Object> p = it.rinfo()->code_age_stub_handle(origin); |
| 10372 Code* code = Code::cast(*p); |
| 10373 it.rinfo()->set_code_age_stub(code); |
| 10370 } else { | 10374 } else { |
| 10371 it.rinfo()->apply(delta); | 10375 it.rinfo()->apply(delta); |
| 10372 } | 10376 } |
| 10373 } | 10377 } |
| 10374 CPU::FlushICache(instruction_start(), instruction_size()); | 10378 CPU::FlushICache(instruction_start(), instruction_size()); |
| 10375 } | 10379 } |
| 10376 | 10380 |
| 10377 | 10381 |
| 10378 // Locate the source position which is closest to the address in the code. This | 10382 // Locate the source position which is closest to the address in the code. This |
| 10379 // is using the source position information embedded in the relocation info. | 10383 // is using the source position information embedded in the relocation info. |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10601 } | 10605 } |
| 10602 return BailoutId::None(); | 10606 return BailoutId::None(); |
| 10603 } | 10607 } |
| 10604 | 10608 |
| 10605 | 10609 |
| 10606 void Code::MakeCodeAgeSequenceYoung(byte* sequence, Isolate* isolate) { | 10610 void Code::MakeCodeAgeSequenceYoung(byte* sequence, Isolate* isolate) { |
| 10607 PatchPlatformCodeAge(isolate, sequence, kNoAge, NO_MARKING_PARITY); | 10611 PatchPlatformCodeAge(isolate, sequence, kNoAge, NO_MARKING_PARITY); |
| 10608 } | 10612 } |
| 10609 | 10613 |
| 10610 | 10614 |
| 10615 void Code::MarkCodeAsExecuted(byte* sequence, Isolate* isolate) { |
| 10616 PatchPlatformCodeAge(isolate, sequence, kExecutedOnceCodeAge, |
| 10617 NO_MARKING_PARITY); |
| 10618 } |
| 10619 |
| 10620 |
| 10611 void Code::MakeOlder(MarkingParity current_parity) { | 10621 void Code::MakeOlder(MarkingParity current_parity) { |
| 10612 byte* sequence = FindCodeAgeSequence(); | 10622 byte* sequence = FindCodeAgeSequence(); |
| 10613 if (sequence != NULL) { | 10623 if (sequence != NULL) { |
| 10614 Age age; | 10624 Age age; |
| 10615 MarkingParity code_parity; | 10625 MarkingParity code_parity; |
| 10616 GetCodeAgeAndParity(sequence, &age, &code_parity); | 10626 GetCodeAgeAndParity(sequence, &age, &code_parity); |
| 10617 if (age != kLastCodeAge && code_parity != current_parity) { | 10627 if (age != kLastCodeAge && code_parity != current_parity) { |
| 10618 PatchPlatformCodeAge(GetIsolate(), | 10628 PatchPlatformCodeAge(GetIsolate(), |
| 10619 sequence, | 10629 sequence, |
| 10620 static_cast<Age>(age + 1), | 10630 static_cast<Age>(age + 1), |
| 10621 current_parity); | 10631 current_parity); |
| 10622 } | 10632 } |
| 10623 } | 10633 } |
| 10624 } | 10634 } |
| 10625 | 10635 |
| 10626 | 10636 |
| 10627 bool Code::IsOld() { | 10637 bool Code::IsOld() { |
| 10628 byte* sequence = FindCodeAgeSequence(); | 10638 Age age = GetAge(); |
| 10629 if (sequence == NULL) return false; | 10639 return age >= kIsOldCodeAge; |
| 10630 Age age; | |
| 10631 MarkingParity parity; | |
| 10632 GetCodeAgeAndParity(sequence, &age, &parity); | |
| 10633 return age >= kSexagenarianCodeAge; | |
| 10634 } | 10640 } |
| 10635 | 10641 |
| 10636 | 10642 |
| 10637 byte* Code::FindCodeAgeSequence() { | 10643 byte* Code::FindCodeAgeSequence() { |
| 10638 return FLAG_age_code && | 10644 return FLAG_age_code && |
| 10639 prologue_offset() != kPrologueOffsetNotSet && | 10645 prologue_offset() != Code::kPrologueOffsetNotSet && |
| 10640 (kind() == OPTIMIZED_FUNCTION || | 10646 (kind() == OPTIMIZED_FUNCTION || |
| 10641 (kind() == FUNCTION && !has_debug_break_slots())) | 10647 (kind() == FUNCTION && !has_debug_break_slots())) |
| 10642 ? instruction_start() + prologue_offset() | 10648 ? instruction_start() + prologue_offset() |
| 10643 : NULL; | 10649 : NULL; |
| 10644 } | 10650 } |
| 10645 | 10651 |
| 10646 | 10652 |
| 10647 int Code::GetAge() { | 10653 Code::Age Code::GetAge() { |
| 10648 byte* sequence = FindCodeAgeSequence(); | 10654 byte* sequence = FindCodeAgeSequence(); |
| 10649 if (sequence == NULL) { | 10655 if (sequence == NULL) { |
| 10650 return Code::kNoAge; | 10656 return Code::kNoAge; |
| 10651 } | 10657 } |
| 10652 Age age; | 10658 Age age; |
| 10653 MarkingParity parity; | 10659 MarkingParity parity; |
| 10654 GetCodeAgeAndParity(sequence, &age, &parity); | 10660 GetCodeAgeAndParity(sequence, &age, &parity); |
| 10655 return age; | 10661 return age; |
| 10656 } | 10662 } |
| 10657 | 10663 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 10669 return; \ | 10675 return; \ |
| 10670 } \ | 10676 } \ |
| 10671 stub = *builtins->Make##AGE##CodeYoungAgainOddMarking(); \ | 10677 stub = *builtins->Make##AGE##CodeYoungAgainOddMarking(); \ |
| 10672 if (code == stub) { \ | 10678 if (code == stub) { \ |
| 10673 *age = k##AGE##CodeAge; \ | 10679 *age = k##AGE##CodeAge; \ |
| 10674 *parity = ODD_MARKING_PARITY; \ | 10680 *parity = ODD_MARKING_PARITY; \ |
| 10675 return; \ | 10681 return; \ |
| 10676 } | 10682 } |
| 10677 CODE_AGE_LIST(HANDLE_CODE_AGE) | 10683 CODE_AGE_LIST(HANDLE_CODE_AGE) |
| 10678 #undef HANDLE_CODE_AGE | 10684 #undef HANDLE_CODE_AGE |
| 10685 stub = *builtins->MarkCodeAsExecutedOnce(); |
| 10686 if (code == stub) { |
| 10687 // Treat that's never been executed as old immediatly. |
| 10688 *age = kIsOldCodeAge; |
| 10689 *parity = NO_MARKING_PARITY; |
| 10690 return; |
| 10691 } |
| 10692 stub = *builtins->MarkCodeAsExecutedTwice(); |
| 10693 if (code == stub) { |
| 10694 // Pre-age code that has only been executed once. |
| 10695 *age = kPreAgedCodeAge; |
| 10696 *parity = NO_MARKING_PARITY; |
| 10697 return; |
| 10698 } |
| 10679 UNREACHABLE(); | 10699 UNREACHABLE(); |
| 10680 } | 10700 } |
| 10681 | 10701 |
| 10682 | 10702 |
| 10683 Code* Code::GetCodeAgeStub(Isolate* isolate, Age age, MarkingParity parity) { | 10703 Code* Code::GetCodeAgeStub(Isolate* isolate, Age age, MarkingParity parity) { |
| 10684 Builtins* builtins = isolate->builtins(); | 10704 Builtins* builtins = isolate->builtins(); |
| 10685 switch (age) { | 10705 switch (age) { |
| 10686 #define HANDLE_CODE_AGE(AGE) \ | 10706 #define HANDLE_CODE_AGE(AGE) \ |
| 10687 case k##AGE##CodeAge: { \ | 10707 case k##AGE##CodeAge: { \ |
| 10688 Code* stub = parity == EVEN_MARKING_PARITY \ | 10708 Code* stub = parity == EVEN_MARKING_PARITY \ |
| 10689 ? *builtins->Make##AGE##CodeYoungAgainEvenMarking() \ | 10709 ? *builtins->Make##AGE##CodeYoungAgainEvenMarking() \ |
| 10690 : *builtins->Make##AGE##CodeYoungAgainOddMarking(); \ | 10710 : *builtins->Make##AGE##CodeYoungAgainOddMarking(); \ |
| 10691 return stub; \ | 10711 return stub; \ |
| 10692 } | 10712 } |
| 10693 CODE_AGE_LIST(HANDLE_CODE_AGE) | 10713 CODE_AGE_LIST(HANDLE_CODE_AGE) |
| 10694 #undef HANDLE_CODE_AGE | 10714 #undef HANDLE_CODE_AGE |
| 10715 case kNotExecutedCodeAge: { |
| 10716 ASSERT(parity == NO_MARKING_PARITY); |
| 10717 return *builtins->MarkCodeAsExecutedOnce(); |
| 10718 } |
| 10719 case kExecutedOnceCodeAge: { |
| 10720 ASSERT(parity == NO_MARKING_PARITY); |
| 10721 return *builtins->MarkCodeAsExecutedTwice(); |
| 10722 } |
| 10695 default: | 10723 default: |
| 10696 UNREACHABLE(); | 10724 UNREACHABLE(); |
| 10697 break; | 10725 break; |
| 10698 } | 10726 } |
| 10699 return NULL; | 10727 return NULL; |
| 10700 } | 10728 } |
| 10701 | 10729 |
| 10702 | 10730 |
| 10703 void Code::PrintDeoptLocation(int bailout_id) { | 10731 void Code::PrintDeoptLocation(int bailout_id) { |
| 10704 const char* last_comment = NULL; | 10732 const char* last_comment = NULL; |
| (...skipping 5664 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16369 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16397 #define ERROR_MESSAGES_TEXTS(C, T) T, |
| 16370 static const char* error_messages_[] = { | 16398 static const char* error_messages_[] = { |
| 16371 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16399 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
| 16372 }; | 16400 }; |
| 16373 #undef ERROR_MESSAGES_TEXTS | 16401 #undef ERROR_MESSAGES_TEXTS |
| 16374 return error_messages_[reason]; | 16402 return error_messages_[reason]; |
| 16375 } | 16403 } |
| 16376 | 16404 |
| 16377 | 16405 |
| 16378 } } // namespace v8::internal | 16406 } } // namespace v8::internal |
| OLD | NEW |