Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/objects.cc

Issue 2529173002: [Heap] Remove concept of MarkingParity. (Closed)
Patch Set: Fix arm Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/objects.h" 5 #include "src/objects.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <iomanip> 8 #include <iomanip>
9 #include <memory> 9 #include <memory>
10 #include <sstream> 10 #include <sstream>
(...skipping 14389 matching lines...) Expand 10 before | Expand all | Expand 10 after
14400 } 14400 }
14401 14401
14402 int Code::LookupRangeInHandlerTable(int code_offset, int* data, 14402 int Code::LookupRangeInHandlerTable(int code_offset, int* data,
14403 HandlerTable::CatchPrediction* prediction) { 14403 HandlerTable::CatchPrediction* prediction) {
14404 DCHECK(!is_optimized_code()); 14404 DCHECK(!is_optimized_code());
14405 HandlerTable* table = HandlerTable::cast(handler_table()); 14405 HandlerTable* table = HandlerTable::cast(handler_table());
14406 return table->LookupRange(code_offset, data, prediction); 14406 return table->LookupRange(code_offset, data, prediction);
14407 } 14407 }
14408 14408
14409 void Code::MakeCodeAgeSequenceYoung(byte* sequence, Isolate* isolate) { 14409 void Code::MakeCodeAgeSequenceYoung(byte* sequence, Isolate* isolate) {
14410 PatchPlatformCodeAge(isolate, sequence, kNoAgeCodeAge, NO_MARKING_PARITY); 14410 PatchPlatformCodeAge(isolate, sequence, kNoAgeCodeAge);
14411 } 14411 }
14412 14412
14413 14413
14414 void Code::MarkCodeAsExecuted(byte* sequence, Isolate* isolate) { 14414 void Code::MarkCodeAsExecuted(byte* sequence, Isolate* isolate) {
14415 PatchPlatformCodeAge(isolate, sequence, kExecutedOnceCodeAge, 14415 PatchPlatformCodeAge(isolate, sequence, kExecutedOnceCodeAge);
14416 NO_MARKING_PARITY);
14417 } 14416 }
14418 14417
14419 14418
14420 // NextAge defines the Code::Age state transitions during a GC cycle. 14419 // NextAge defines the Code::Age state transitions during a GC cycle.
14421 static Code::Age NextAge(Code::Age age) { 14420 static Code::Age NextAge(Code::Age age) {
14422 switch (age) { 14421 switch (age) {
14423 case Code::kNotExecutedCodeAge: // Keep, until we've been executed. 14422 case Code::kNotExecutedCodeAge: // Keep, until we've been executed.
14424 case Code::kToBeExecutedOnceCodeAge: // Keep, until we've been executed. 14423 case Code::kToBeExecutedOnceCodeAge: // Keep, until we've been executed.
14425 case Code::kLastCodeAge: // Clamp at last Code::Age value. 14424 case Code::kLastCodeAge: // Clamp at last Code::Age value.
14426 return age; 14425 return age;
(...skipping 13 matching lines...) Expand all
14440 14439
14441 14440
14442 void Code::MakeYoung(Isolate* isolate) { 14441 void Code::MakeYoung(Isolate* isolate) {
14443 byte* sequence = FindCodeAgeSequence(); 14442 byte* sequence = FindCodeAgeSequence();
14444 if (sequence != NULL) MakeCodeAgeSequenceYoung(sequence, isolate); 14443 if (sequence != NULL) MakeCodeAgeSequenceYoung(sequence, isolate);
14445 } 14444 }
14446 14445
14447 void Code::PreAge(Isolate* isolate) { 14446 void Code::PreAge(Isolate* isolate) {
14448 byte* sequence = FindCodeAgeSequence(); 14447 byte* sequence = FindCodeAgeSequence();
14449 if (sequence != NULL) { 14448 if (sequence != NULL) {
14450 PatchPlatformCodeAge(isolate, sequence, kPreAgedCodeAge, NO_MARKING_PARITY); 14449 PatchPlatformCodeAge(isolate, sequence, kPreAgedCodeAge);
14451 } 14450 }
14452 } 14451 }
14453 14452
14454 void Code::MarkToBeExecutedOnce(Isolate* isolate) { 14453 void Code::MarkToBeExecutedOnce(Isolate* isolate) {
14455 byte* sequence = FindCodeAgeSequence(); 14454 byte* sequence = FindCodeAgeSequence();
14456 if (sequence != NULL) { 14455 if (sequence != NULL) {
14457 PatchPlatformCodeAge(isolate, sequence, kToBeExecutedOnceCodeAge, 14456 PatchPlatformCodeAge(isolate, sequence, kToBeExecutedOnceCodeAge);
14458 NO_MARKING_PARITY);
14459 } 14457 }
14460 } 14458 }
14461 14459
14462 void Code::MakeOlder(MarkingParity current_parity) { 14460 void Code::MakeOlder() {
14463 byte* sequence = FindCodeAgeSequence(); 14461 byte* sequence = FindCodeAgeSequence();
14464 if (sequence != NULL) { 14462 if (sequence != NULL) {
14465 Age age;
14466 MarkingParity code_parity;
14467 Isolate* isolate = GetIsolate(); 14463 Isolate* isolate = GetIsolate();
14468 GetCodeAgeAndParity(isolate, sequence, &age, &code_parity); 14464 Age age = GetCodeAge(isolate, sequence);
14469 Age next_age = NextAge(age); 14465 Age next_age = NextAge(age);
14470 if (age != next_age && code_parity != current_parity) { 14466 if (age != next_age) {
14471 PatchPlatformCodeAge(isolate, sequence, next_age, current_parity); 14467 PatchPlatformCodeAge(isolate, sequence, next_age);
14472 } 14468 }
14473 } 14469 }
14474 } 14470 }
14475 14471
14476 14472
14477 bool Code::IsOld() { 14473 bool Code::IsOld() {
14478 return IsOldAge(GetAge()); 14474 return IsOldAge(GetAge());
14479 } 14475 }
14480 14476
14481 14477
14482 byte* Code::FindCodeAgeSequence() { 14478 byte* Code::FindCodeAgeSequence() {
14483 return FLAG_age_code && 14479 return FLAG_age_code &&
14484 prologue_offset() != Code::kPrologueOffsetNotSet && 14480 prologue_offset() != Code::kPrologueOffsetNotSet &&
14485 (kind() == OPTIMIZED_FUNCTION || 14481 (kind() == OPTIMIZED_FUNCTION ||
14486 (kind() == FUNCTION && !has_debug_break_slots())) 14482 (kind() == FUNCTION && !has_debug_break_slots()))
14487 ? instruction_start() + prologue_offset() 14483 ? instruction_start() + prologue_offset()
14488 : NULL; 14484 : NULL;
14489 } 14485 }
14490 14486
14491 14487
14492 Code::Age Code::GetAge() { 14488 Code::Age Code::GetAge() {
14493 byte* sequence = FindCodeAgeSequence(); 14489 byte* sequence = FindCodeAgeSequence();
14494 if (sequence == NULL) { 14490 if (sequence == NULL) {
14495 return kNoAgeCodeAge; 14491 return kNoAgeCodeAge;
14496 } 14492 }
14497 Age age; 14493 return GetCodeAge(GetIsolate(), sequence);
14498 MarkingParity parity;
14499 GetCodeAgeAndParity(GetIsolate(), sequence, &age, &parity);
14500 return age;
14501 } 14494 }
14502 14495
14503 14496 Code::Age Code::GetAgeOfCodeAgeStub(Code* code) {
14504 void Code::GetCodeAgeAndParity(Code* code, Age* age,
14505 MarkingParity* parity) {
14506 Isolate* isolate = code->GetIsolate(); 14497 Isolate* isolate = code->GetIsolate();
14507 Builtins* builtins = isolate->builtins(); 14498 Builtins* builtins = isolate->builtins();
14508 Code* stub = NULL; 14499 #define HANDLE_CODE_AGE(AGE) \
14509 #define HANDLE_CODE_AGE(AGE) \ 14500 if (code == *builtins->Make##AGE##CodeYoungAgain()) { \
14510 stub = *builtins->Make##AGE##CodeYoungAgainEvenMarking(); \ 14501 return k##AGE##CodeAge; \
14511 if (code == stub) { \
14512 *age = k##AGE##CodeAge; \
14513 *parity = EVEN_MARKING_PARITY; \
14514 return; \
14515 } \
14516 stub = *builtins->Make##AGE##CodeYoungAgainOddMarking(); \
14517 if (code == stub) { \
14518 *age = k##AGE##CodeAge; \
14519 *parity = ODD_MARKING_PARITY; \
14520 return; \
14521 } 14502 }
14522 CODE_AGE_LIST(HANDLE_CODE_AGE) 14503 CODE_AGE_LIST(HANDLE_CODE_AGE)
14523 #undef HANDLE_CODE_AGE 14504 #undef HANDLE_CODE_AGE
14524 stub = *builtins->MarkCodeAsExecutedOnce(); 14505 if (code == *builtins->MarkCodeAsExecutedOnce()) {
14525 if (code == stub) { 14506 return kNotExecutedCodeAge;
14526 *age = kNotExecutedCodeAge;
14527 *parity = NO_MARKING_PARITY;
14528 return;
14529 } 14507 }
14530 stub = *builtins->MarkCodeAsExecutedTwice(); 14508 if (code == *builtins->MarkCodeAsExecutedTwice()) {
14531 if (code == stub) { 14509 return kExecutedOnceCodeAge;
14532 *age = kExecutedOnceCodeAge;
14533 *parity = NO_MARKING_PARITY;
14534 return;
14535 } 14510 }
14536 stub = *builtins->MarkCodeAsToBeExecutedOnce(); 14511 if (code == *builtins->MarkCodeAsToBeExecutedOnce()) {
14537 if (code == stub) { 14512 return kToBeExecutedOnceCodeAge;
14538 *age = kToBeExecutedOnceCodeAge;
14539 *parity = NO_MARKING_PARITY;
14540 return;
14541 } 14513 }
14542 UNREACHABLE(); 14514 UNREACHABLE();
14515 return kNoAgeCodeAge;
14543 } 14516 }
14544 14517
14545 14518 Code* Code::GetCodeAgeStub(Isolate* isolate, Age age) {
14546 Code* Code::GetCodeAgeStub(Isolate* isolate, Age age, MarkingParity parity) {
14547 Builtins* builtins = isolate->builtins(); 14519 Builtins* builtins = isolate->builtins();
14548 switch (age) { 14520 switch (age) {
14549 #define HANDLE_CODE_AGE(AGE) \ 14521 #define HANDLE_CODE_AGE(AGE) \
14550 case k##AGE##CodeAge: { \ 14522 case k##AGE##CodeAge: { \
14551 Code* stub = parity == EVEN_MARKING_PARITY \ 14523 return *builtins->Make##AGE##CodeYoungAgain(); \
14552 ? *builtins->Make##AGE##CodeYoungAgainEvenMarking() \ 14524 }
14553 : *builtins->Make##AGE##CodeYoungAgainOddMarking(); \
14554 return stub; \
14555 }
14556 CODE_AGE_LIST(HANDLE_CODE_AGE) 14525 CODE_AGE_LIST(HANDLE_CODE_AGE)
14557 #undef HANDLE_CODE_AGE 14526 #undef HANDLE_CODE_AGE
14558 case kNotExecutedCodeAge: { 14527 case kNotExecutedCodeAge: {
14559 DCHECK(parity == NO_MARKING_PARITY);
14560 return *builtins->MarkCodeAsExecutedOnce(); 14528 return *builtins->MarkCodeAsExecutedOnce();
14561 } 14529 }
14562 case kExecutedOnceCodeAge: { 14530 case kExecutedOnceCodeAge: {
14563 DCHECK(parity == NO_MARKING_PARITY);
14564 return *builtins->MarkCodeAsExecutedTwice(); 14531 return *builtins->MarkCodeAsExecutedTwice();
14565 } 14532 }
14566 case kToBeExecutedOnceCodeAge: { 14533 case kToBeExecutedOnceCodeAge: {
14567 DCHECK(parity == NO_MARKING_PARITY);
14568 return *builtins->MarkCodeAsToBeExecutedOnce(); 14534 return *builtins->MarkCodeAsToBeExecutedOnce();
14569 } 14535 }
14570 default: 14536 default:
14571 UNREACHABLE(); 14537 UNREACHABLE();
14572 break; 14538 break;
14573 } 14539 }
14574 return NULL; 14540 return NULL;
14575 } 14541 }
14576 14542
14577 14543
(...skipping 5861 matching lines...) Expand 10 before | Expand all | Expand 10 after
20439 // depend on this. 20405 // depend on this.
20440 return DICTIONARY_ELEMENTS; 20406 return DICTIONARY_ELEMENTS;
20441 } 20407 }
20442 DCHECK_LE(kind, LAST_ELEMENTS_KIND); 20408 DCHECK_LE(kind, LAST_ELEMENTS_KIND);
20443 return kind; 20409 return kind;
20444 } 20410 }
20445 } 20411 }
20446 20412
20447 } // namespace internal 20413 } // namespace internal
20448 } // namespace v8 20414 } // namespace v8
OLDNEW
« src/arm/codegen-arm.cc ('K') | « src/objects.h ('k') | src/ppc/codegen-ppc.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698