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

Side by Side Diff: src/objects.cc

Issue 1107233004: Implement kToBeExecutedOnceCodeAge. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@mandreel
Patch Set: Fix comment. Created 5 years, 7 months 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
« no previous file with comments | « src/objects.h ('k') | src/ppc/builtins-ppc.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 <iomanip> 5 #include <iomanip>
6 #include <sstream> 6 #include <sstream>
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/accessors.h" 10 #include "src/accessors.h"
(...skipping 11298 matching lines...) Expand 10 before | Expand all | Expand 10 after
11309 PatchPlatformCodeAge(isolate, sequence, kNoAgeCodeAge, NO_MARKING_PARITY); 11309 PatchPlatformCodeAge(isolate, sequence, kNoAgeCodeAge, NO_MARKING_PARITY);
11310 } 11310 }
11311 11311
11312 11312
11313 void Code::MarkCodeAsExecuted(byte* sequence, Isolate* isolate) { 11313 void Code::MarkCodeAsExecuted(byte* sequence, Isolate* isolate) {
11314 PatchPlatformCodeAge(isolate, sequence, kExecutedOnceCodeAge, 11314 PatchPlatformCodeAge(isolate, sequence, kExecutedOnceCodeAge,
11315 NO_MARKING_PARITY); 11315 NO_MARKING_PARITY);
11316 } 11316 }
11317 11317
11318 11318
11319 static Code::Age EffectiveAge(Code::Age age) { 11319 // NextAge defines the Code::Age state transitions during a GC cycle.
11320 if (age == Code::kNotExecutedCodeAge) { 11320 static Code::Age NextAge(Code::Age age) {
11321 // Treat that's never been executed as old immediately. 11321 switch (age) {
11322 age = Code::kIsOldCodeAge; 11322 case Code::kNotExecutedCodeAge: // Keep, until we've been executed.
11323 } else if (age == Code::kExecutedOnceCodeAge) { 11323 case Code::kToBeExecutedOnceCodeAge: // Keep, until we've been executed.
11324 // Pre-age code that has only been executed once. 11324 case Code::kLastCodeAge: // Clamp at last Code::Age value.
11325 age = Code::kPreAgedCodeAge; 11325 return age;
11326 case Code::kExecutedOnceCodeAge:
11327 // Pre-age code that has only been executed once.
11328 return static_cast<Code::Age>(Code::kPreAgedCodeAge + 1);
11329 default:
11330 return static_cast<Code::Age>(age + 1); // Default case: Increase age.
11326 } 11331 }
11327 return age;
11328 } 11332 }
11329 11333
11330 11334
11335 // IsOldAge defines the collection criteria for a Code object.
11336 static bool IsOldAge(Code::Age age) {
11337 return age >= Code::kIsOldCodeAge || age == Code::kNotExecutedCodeAge;
11338 }
11339
11340
11331 void Code::MakeYoung(Isolate* isolate) { 11341 void Code::MakeYoung(Isolate* isolate) {
11332 byte* sequence = FindCodeAgeSequence(); 11342 byte* sequence = FindCodeAgeSequence();
11333 if (sequence != NULL) MakeCodeAgeSequenceYoung(sequence, isolate); 11343 if (sequence != NULL) MakeCodeAgeSequenceYoung(sequence, isolate);
11334 } 11344 }
11335 11345
11336 11346
11347 void Code::MarkToBeExecutedOnce(Isolate* isolate) {
11348 byte* sequence = FindCodeAgeSequence();
11349 if (sequence != NULL) {
11350 PatchPlatformCodeAge(isolate, sequence, kToBeExecutedOnceCodeAge,
11351 NO_MARKING_PARITY);
11352 }
11353 }
11354
11355
11337 void Code::MakeOlder(MarkingParity current_parity) { 11356 void Code::MakeOlder(MarkingParity current_parity) {
11338 byte* sequence = FindCodeAgeSequence(); 11357 byte* sequence = FindCodeAgeSequence();
11339 if (sequence != NULL) { 11358 if (sequence != NULL) {
11340 Age age; 11359 Age age;
11341 MarkingParity code_parity; 11360 MarkingParity code_parity;
11342 Isolate* isolate = GetIsolate(); 11361 Isolate* isolate = GetIsolate();
11343 GetCodeAgeAndParity(isolate, sequence, &age, &code_parity); 11362 GetCodeAgeAndParity(isolate, sequence, &age, &code_parity);
11344 age = EffectiveAge(age); 11363 Age next_age = NextAge(age);
11345 if (age != kLastCodeAge && code_parity != current_parity) { 11364 if (age != next_age && code_parity != current_parity) {
11346 PatchPlatformCodeAge(isolate, 11365 PatchPlatformCodeAge(isolate, sequence, next_age, current_parity);
11347 sequence,
11348 static_cast<Age>(age + 1),
11349 current_parity);
11350 } 11366 }
11351 } 11367 }
11352 } 11368 }
11353 11369
11354 11370
11355 bool Code::IsOld() { 11371 bool Code::IsOld() {
11356 return GetAge() >= kIsOldCodeAge; 11372 return IsOldAge(GetAge());
11357 } 11373 }
11358 11374
11359 11375
11360 byte* Code::FindCodeAgeSequence() { 11376 byte* Code::FindCodeAgeSequence() {
11361 return FLAG_age_code && 11377 return FLAG_age_code &&
11362 prologue_offset() != Code::kPrologueOffsetNotSet && 11378 prologue_offset() != Code::kPrologueOffsetNotSet &&
11363 (kind() == OPTIMIZED_FUNCTION || 11379 (kind() == OPTIMIZED_FUNCTION ||
11364 (kind() == FUNCTION && !has_debug_break_slots())) 11380 (kind() == FUNCTION && !has_debug_break_slots()))
11365 ? instruction_start() + prologue_offset() 11381 ? instruction_start() + prologue_offset()
11366 : NULL; 11382 : NULL;
11367 } 11383 }
11368 11384
11369 11385
11370 Code::Age Code::GetAge() { 11386 Code::Age Code::GetAge() {
11371 return EffectiveAge(GetRawAge());
11372 }
11373
11374
11375 Code::Age Code::GetRawAge() {
11376 byte* sequence = FindCodeAgeSequence(); 11387 byte* sequence = FindCodeAgeSequence();
11377 if (sequence == NULL) { 11388 if (sequence == NULL) {
11378 return kNoAgeCodeAge; 11389 return kNoAgeCodeAge;
11379 } 11390 }
11380 Age age; 11391 Age age;
11381 MarkingParity parity; 11392 MarkingParity parity;
11382 GetCodeAgeAndParity(GetIsolate(), sequence, &age, &parity); 11393 GetCodeAgeAndParity(GetIsolate(), sequence, &age, &parity);
11383 return age; 11394 return age;
11384 } 11395 }
11385 11396
(...skipping 23 matching lines...) Expand all
11409 *age = kNotExecutedCodeAge; 11420 *age = kNotExecutedCodeAge;
11410 *parity = NO_MARKING_PARITY; 11421 *parity = NO_MARKING_PARITY;
11411 return; 11422 return;
11412 } 11423 }
11413 stub = *builtins->MarkCodeAsExecutedTwice(); 11424 stub = *builtins->MarkCodeAsExecutedTwice();
11414 if (code == stub) { 11425 if (code == stub) {
11415 *age = kExecutedOnceCodeAge; 11426 *age = kExecutedOnceCodeAge;
11416 *parity = NO_MARKING_PARITY; 11427 *parity = NO_MARKING_PARITY;
11417 return; 11428 return;
11418 } 11429 }
11430 stub = *builtins->MarkCodeAsToBeExecutedOnce();
11431 if (code == stub) {
11432 *age = kToBeExecutedOnceCodeAge;
11433 *parity = NO_MARKING_PARITY;
11434 return;
11435 }
11419 UNREACHABLE(); 11436 UNREACHABLE();
11420 } 11437 }
11421 11438
11422 11439
11423 Code* Code::GetCodeAgeStub(Isolate* isolate, Age age, MarkingParity parity) { 11440 Code* Code::GetCodeAgeStub(Isolate* isolate, Age age, MarkingParity parity) {
11424 Builtins* builtins = isolate->builtins(); 11441 Builtins* builtins = isolate->builtins();
11425 switch (age) { 11442 switch (age) {
11426 #define HANDLE_CODE_AGE(AGE) \ 11443 #define HANDLE_CODE_AGE(AGE) \
11427 case k##AGE##CodeAge: { \ 11444 case k##AGE##CodeAge: { \
11428 Code* stub = parity == EVEN_MARKING_PARITY \ 11445 Code* stub = parity == EVEN_MARKING_PARITY \
11429 ? *builtins->Make##AGE##CodeYoungAgainEvenMarking() \ 11446 ? *builtins->Make##AGE##CodeYoungAgainEvenMarking() \
11430 : *builtins->Make##AGE##CodeYoungAgainOddMarking(); \ 11447 : *builtins->Make##AGE##CodeYoungAgainOddMarking(); \
11431 return stub; \ 11448 return stub; \
11432 } 11449 }
11433 CODE_AGE_LIST(HANDLE_CODE_AGE) 11450 CODE_AGE_LIST(HANDLE_CODE_AGE)
11434 #undef HANDLE_CODE_AGE 11451 #undef HANDLE_CODE_AGE
11435 case kNotExecutedCodeAge: { 11452 case kNotExecutedCodeAge: {
11436 DCHECK(parity == NO_MARKING_PARITY); 11453 DCHECK(parity == NO_MARKING_PARITY);
11437 return *builtins->MarkCodeAsExecutedOnce(); 11454 return *builtins->MarkCodeAsExecutedOnce();
11438 } 11455 }
11439 case kExecutedOnceCodeAge: { 11456 case kExecutedOnceCodeAge: {
11440 DCHECK(parity == NO_MARKING_PARITY); 11457 DCHECK(parity == NO_MARKING_PARITY);
11441 return *builtins->MarkCodeAsExecutedTwice(); 11458 return *builtins->MarkCodeAsExecutedTwice();
11442 } 11459 }
11460 case kToBeExecutedOnceCodeAge: {
11461 DCHECK(parity == NO_MARKING_PARITY);
11462 return *builtins->MarkCodeAsToBeExecutedOnce();
11463 }
11443 default: 11464 default:
11444 UNREACHABLE(); 11465 UNREACHABLE();
11445 break; 11466 break;
11446 } 11467 }
11447 return NULL; 11468 return NULL;
11448 } 11469 }
11449 11470
11450 11471
11451 void Code::PrintDeoptLocation(FILE* out, Address pc) { 11472 void Code::PrintDeoptLocation(FILE* out, Address pc) {
11452 Deoptimizer::DeoptInfo info = Deoptimizer::GetDeoptInfo(this, pc); 11473 Deoptimizer::DeoptInfo info = Deoptimizer::GetDeoptInfo(this, pc);
(...skipping 5680 matching lines...) Expand 10 before | Expand all | Expand 10 after
17133 void PropertyCell::SetValueWithInvalidation(Handle<PropertyCell> cell, 17154 void PropertyCell::SetValueWithInvalidation(Handle<PropertyCell> cell,
17134 Handle<Object> new_value) { 17155 Handle<Object> new_value) {
17135 if (cell->value() != *new_value) { 17156 if (cell->value() != *new_value) {
17136 cell->set_value(*new_value); 17157 cell->set_value(*new_value);
17137 Isolate* isolate = cell->GetIsolate(); 17158 Isolate* isolate = cell->GetIsolate();
17138 cell->dependent_code()->DeoptimizeDependentCodeGroup( 17159 cell->dependent_code()->DeoptimizeDependentCodeGroup(
17139 isolate, DependentCode::kPropertyCellChangedGroup); 17160 isolate, DependentCode::kPropertyCellChangedGroup);
17140 } 17161 }
17141 } 17162 }
17142 } } // namespace v8::internal 17163 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/ppc/builtins-ppc.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698