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

Side by Side Diff: src/objects.cc

Issue 23480031: Enable preaging of code objects when --optimize-for-size. (Closed) Base URL: https://v8.googlecode.com/svn/trunk
Patch Set: Add missing ia32 lithium codegen. Created 7 years, 2 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 | Annotate | Revision Log
OLDNEW
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 10147 matching lines...) Expand 10 before | Expand all | Expand 10 after
10158 } else if (RelocInfo::IsCodeTarget(mode)) { 10158 } else if (RelocInfo::IsCodeTarget(mode)) {
10159 // rewrite code handles in inline cache targets to direct 10159 // rewrite code handles in inline cache targets to direct
10160 // pointers to the first instruction in the code object 10160 // pointers to the first instruction in the code object
10161 Handle<Object> p = it.rinfo()->target_object_handle(origin); 10161 Handle<Object> p = it.rinfo()->target_object_handle(origin);
10162 Code* code = Code::cast(*p); 10162 Code* code = Code::cast(*p);
10163 it.rinfo()->set_target_address(code->instruction_start(), 10163 it.rinfo()->set_target_address(code->instruction_start(),
10164 SKIP_WRITE_BARRIER); 10164 SKIP_WRITE_BARRIER);
10165 } else if (RelocInfo::IsRuntimeEntry(mode)) { 10165 } else if (RelocInfo::IsRuntimeEntry(mode)) {
10166 Address p = it.rinfo()->target_runtime_entry(origin); 10166 Address p = it.rinfo()->target_runtime_entry(origin);
10167 it.rinfo()->set_target_runtime_entry(p, SKIP_WRITE_BARRIER); 10167 it.rinfo()->set_target_runtime_entry(p, SKIP_WRITE_BARRIER);
10168 } else if (mode == RelocInfo::CODE_AGE_SEQUENCE) {
10169 Handle<Object> p = it.rinfo()->code_age_stub_handle(origin);
10170 Code* code = Code::cast(*p);
10171 it.rinfo()->set_code_age_stub(code);
10168 } else { 10172 } else {
10169 it.rinfo()->apply(delta); 10173 it.rinfo()->apply(delta);
10170 } 10174 }
10171 } 10175 }
10172 CPU::FlushICache(instruction_start(), instruction_size()); 10176 CPU::FlushICache(instruction_start(), instruction_size());
10173 } 10177 }
10174 10178
10175 10179
10176 // Locate the source position which is closest to the address in the code. This 10180 // Locate the source position which is closest to the address in the code. This
10177 // is using the source position information embedded in the relocation info. 10181 // is using the source position information embedded in the relocation info.
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
10402 (is_compare_ic_stub() && 10406 (is_compare_ic_stub() &&
10403 ICCompareStub::CompareState(stub_info()) == CompareIC::KNOWN_OBJECT); 10407 ICCompareStub::CompareState(stub_info()) == CompareIC::KNOWN_OBJECT);
10404 } 10408 }
10405 10409
10406 10410
10407 void Code::MakeCodeAgeSequenceYoung(byte* sequence, Isolate* isolate) { 10411 void Code::MakeCodeAgeSequenceYoung(byte* sequence, Isolate* isolate) {
10408 PatchPlatformCodeAge(isolate, sequence, kNoAge, NO_MARKING_PARITY); 10412 PatchPlatformCodeAge(isolate, sequence, kNoAge, NO_MARKING_PARITY);
10409 } 10413 }
10410 10414
10411 10415
10416 void Code::MarkCodeAsExecuted(byte* sequence, Isolate* isolate) {
10417 PatchPlatformCodeAge(isolate, sequence, kExecutedOnceCodeAge,
10418 NO_MARKING_PARITY);
10419 }
10420
10421
10412 void Code::MakeOlder(MarkingParity current_parity) { 10422 void Code::MakeOlder(MarkingParity current_parity) {
10413 byte* sequence = FindCodeAgeSequence(); 10423 byte* sequence = FindCodeAgeSequence();
10414 if (sequence != NULL) { 10424 if (sequence != NULL) {
10415 Age age; 10425 Age age;
10416 MarkingParity code_parity; 10426 MarkingParity code_parity;
10417 GetCodeAgeAndParity(sequence, &age, &code_parity); 10427 GetCodeAgeAndParity(sequence, &age, &code_parity);
10418 if (age != kLastCodeAge && code_parity != current_parity) { 10428 if (age != kLastCodeAge && code_parity != current_parity) {
10419 PatchPlatformCodeAge(GetIsolate(), 10429 PatchPlatformCodeAge(GetIsolate(),
10420 sequence, 10430 sequence,
10421 static_cast<Age>(age + 1), 10431 static_cast<Age>(age + 1),
10422 current_parity); 10432 current_parity);
10423 } 10433 }
10424 } 10434 }
10425 } 10435 }
10426 10436
10427 10437
10428 bool Code::IsOld() { 10438 bool Code::IsOld() {
10429 byte* sequence = FindCodeAgeSequence(); 10439 Age age = GetAge();
10430 if (sequence == NULL) return false; 10440 return age >= kIsOldCodeAge;
10431 Age age;
10432 MarkingParity parity;
10433 GetCodeAgeAndParity(sequence, &age, &parity);
10434 return age >= kSexagenarianCodeAge;
10435 } 10441 }
10436 10442
10437 10443
10438 byte* Code::FindCodeAgeSequence() { 10444 byte* Code::FindCodeAgeSequence() {
10439 return FLAG_age_code && 10445 return FLAG_age_code &&
10440 prologue_offset() != kPrologueOffsetNotSet && 10446 prologue_offset() != kPrologueOffsetNotSet &&
10441 (kind() == OPTIMIZED_FUNCTION || 10447 (kind() == OPTIMIZED_FUNCTION ||
10442 (kind() == FUNCTION && !has_debug_break_slots())) 10448 (kind() == FUNCTION && !has_debug_break_slots()))
10443 ? instruction_start() + prologue_offset() 10449 ? instruction_start() + prologue_offset()
10444 : NULL; 10450 : NULL;
10445 } 10451 }
10446 10452
10447 10453
10448 int Code::GetAge() { 10454 Code::Age Code::GetAge() {
10449 byte* sequence = FindCodeAgeSequence(); 10455 byte* sequence = FindCodeAgeSequence();
10450 if (sequence == NULL) { 10456 if (sequence == NULL) {
10451 return Code::kNoAge; 10457 return Code::kNoAge;
10452 } 10458 }
10453 Age age; 10459 Age age;
10454 MarkingParity parity; 10460 MarkingParity parity;
10455 GetCodeAgeAndParity(sequence, &age, &parity); 10461 GetCodeAgeAndParity(sequence, &age, &parity);
10456 return age; 10462 return age;
10457 } 10463 }
10458 10464
(...skipping 11 matching lines...) Expand all
10470 return; \ 10476 return; \
10471 } \ 10477 } \
10472 stub = *builtins->Make##AGE##CodeYoungAgainOddMarking(); \ 10478 stub = *builtins->Make##AGE##CodeYoungAgainOddMarking(); \
10473 if (code == stub) { \ 10479 if (code == stub) { \
10474 *age = k##AGE##CodeAge; \ 10480 *age = k##AGE##CodeAge; \
10475 *parity = ODD_MARKING_PARITY; \ 10481 *parity = ODD_MARKING_PARITY; \
10476 return; \ 10482 return; \
10477 } 10483 }
10478 CODE_AGE_LIST(HANDLE_CODE_AGE) 10484 CODE_AGE_LIST(HANDLE_CODE_AGE)
10479 #undef HANDLE_CODE_AGE 10485 #undef HANDLE_CODE_AGE
10486 stub = *builtins->MarkCodeAsExecutedOnce();
10487 if (code == stub) {
10488 // Treat that's never been executed as old immediatly.
10489 *age = kIsOldCodeAge;
10490 *parity = NO_MARKING_PARITY;
10491 return;
10492 }
10493 stub = *builtins->MarkCodeAsExecutedTwice();
10494 if (code == stub) {
10495 // Pre-age code that has only been executed once.
10496 *age = kPreAgedCodeAge;
10497 *parity = NO_MARKING_PARITY;
10498 return;
10499 }
10480 UNREACHABLE(); 10500 UNREACHABLE();
10481 } 10501 }
10482 10502
10483 10503
10484 Code* Code::GetCodeAgeStub(Isolate* isolate, Age age, MarkingParity parity) { 10504 Code* Code::GetCodeAgeStub(Isolate* isolate, Age age, MarkingParity parity) {
10485 Builtins* builtins = isolate->builtins(); 10505 Builtins* builtins = isolate->builtins();
10486 switch (age) { 10506 switch (age) {
10487 #define HANDLE_CODE_AGE(AGE) \ 10507 #define HANDLE_CODE_AGE(AGE) \
10488 case k##AGE##CodeAge: { \ 10508 case k##AGE##CodeAge: { \
10489 Code* stub = parity == EVEN_MARKING_PARITY \ 10509 Code* stub = parity == EVEN_MARKING_PARITY \
10490 ? *builtins->Make##AGE##CodeYoungAgainEvenMarking() \ 10510 ? *builtins->Make##AGE##CodeYoungAgainEvenMarking() \
10491 : *builtins->Make##AGE##CodeYoungAgainOddMarking(); \ 10511 : *builtins->Make##AGE##CodeYoungAgainOddMarking(); \
10492 return stub; \ 10512 return stub; \
10493 } 10513 }
10494 CODE_AGE_LIST(HANDLE_CODE_AGE) 10514 CODE_AGE_LIST(HANDLE_CODE_AGE)
10495 #undef HANDLE_CODE_AGE 10515 #undef HANDLE_CODE_AGE
10516 case kNotExecutedCodeAge: {
10517 ASSERT(parity == NO_MARKING_PARITY);
10518 return *builtins->MarkCodeAsExecutedOnce();
10519 }
10520 case kExecutedOnceCodeAge: {
10521 ASSERT(parity == NO_MARKING_PARITY);
10522 return *builtins->MarkCodeAsExecutedTwice();
10523 }
10496 default: 10524 default:
10497 UNREACHABLE(); 10525 UNREACHABLE();
10498 break; 10526 break;
10499 } 10527 }
10500 return NULL; 10528 return NULL;
10501 } 10529 }
10502 10530
10503 10531
10504 void Code::PrintDeoptLocation(int bailout_id) { 10532 void Code::PrintDeoptLocation(int bailout_id) {
10505 const char* last_comment = NULL; 10533 const char* last_comment = NULL;
(...skipping 5613 matching lines...) Expand 10 before | Expand all | Expand 10 after
16119 #define ERROR_MESSAGES_TEXTS(C, T) T, 16147 #define ERROR_MESSAGES_TEXTS(C, T) T,
16120 static const char* error_messages_[] = { 16148 static const char* error_messages_[] = {
16121 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) 16149 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS)
16122 }; 16150 };
16123 #undef ERROR_MESSAGES_TEXTS 16151 #undef ERROR_MESSAGES_TEXTS
16124 return error_messages_[reason]; 16152 return error_messages_[reason];
16125 } 16153 }
16126 16154
16127 16155
16128 } } // namespace v8::internal 16156 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698