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

Side by Side Diff: src/assembler.cc

Issue 10837037: Age code to allow reclaiming old unexecuted functions (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Review feedback Created 8 years, 3 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 (c) 1994-2006 Sun Microsystems Inc. 1 // Copyright (c) 1994-2006 Sun Microsystems Inc.
2 // All Rights Reserved. 2 // All Rights Reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are 5 // modification, are permitted provided that the following conditions are
6 // met: 6 // met:
7 // 7 //
8 // - Redistributions of source code must retain the above copyright notice, 8 // - Redistributions of source code must retain the above copyright notice,
9 // this list of conditions and the following disclaimer. 9 // this list of conditions and the following disclaimer.
10 // 10 //
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after
306 // Signed right shift is arithmetic shift. Tested in test-utils.cc. 306 // Signed right shift is arithmetic shift. Tested in test-utils.cc.
307 data_delta = data_delta >> kBitsPerByte; 307 data_delta = data_delta >> kBitsPerByte;
308 } 308 }
309 } 309 }
310 310
311 311
312 void RelocInfoWriter::Write(const RelocInfo* rinfo) { 312 void RelocInfoWriter::Write(const RelocInfo* rinfo) {
313 #ifdef DEBUG 313 #ifdef DEBUG
314 byte* begin_pos = pos_; 314 byte* begin_pos = pos_;
315 #endif 315 #endif
316 ASSERT(rinfo->rmode() < RelocInfo::NUMBER_OF_MODES);
316 ASSERT(rinfo->pc() - last_pc_ >= 0); 317 ASSERT(rinfo->pc() - last_pc_ >= 0);
317 ASSERT(RelocInfo::LAST_STANDARD_NONCOMPACT_ENUM - RelocInfo::LAST_COMPACT_ENUM 318 ASSERT(RelocInfo::LAST_STANDARD_NONCOMPACT_ENUM - RelocInfo::LAST_COMPACT_ENUM
318 <= kMaxStandardNonCompactModes); 319 <= kMaxStandardNonCompactModes);
319 // Use unsigned delta-encoding for pc. 320 // Use unsigned delta-encoding for pc.
320 uint32_t pc_delta = static_cast<uint32_t>(rinfo->pc() - last_pc_); 321 uint32_t pc_delta = static_cast<uint32_t>(rinfo->pc() - last_pc_);
321 RelocInfo::Mode rmode = rinfo->rmode(); 322 RelocInfo::Mode rmode = rinfo->rmode();
322 323
323 // The two most common modes are given small tags, and usually fit in a byte. 324 // The two most common modes are given small tags, and usually fit in a byte.
324 if (rmode == RelocInfo::EMBEDDED_OBJECT) { 325 if (rmode == RelocInfo::EMBEDDED_OBJECT) {
325 WriteTaggedPC(pc_delta, kEmbeddedObjectTag); 326 WriteTaggedPC(pc_delta, kEmbeddedObjectTag);
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
563 return; 564 return;
564 } 565 }
565 Advance(kIntSize); 566 Advance(kIntSize);
566 } else { 567 } else {
567 AdvanceReadPC(); 568 AdvanceReadPC();
568 int rmode = extra_tag + RelocInfo::LAST_COMPACT_ENUM; 569 int rmode = extra_tag + RelocInfo::LAST_COMPACT_ENUM;
569 if (SetMode(static_cast<RelocInfo::Mode>(rmode))) return; 570 if (SetMode(static_cast<RelocInfo::Mode>(rmode))) return;
570 } 571 }
571 } 572 }
572 } 573 }
574 if (code_age_sequence_ != NULL) {
575 rinfo_.pc_ = code_age_sequence_;
576 code_age_sequence_ = NULL;
577 rinfo_.data_ = 0;
578 if (SetMode(RelocInfo::CODE_AGE_SEQUENCE)) {
579 return;
580 }
581 }
573 done_ = true; 582 done_ = true;
574 } 583 }
575 584
576 585
577 RelocIterator::RelocIterator(Code* code, int mode_mask) { 586 RelocIterator::RelocIterator(Code* code, int mode_mask) {
578 rinfo_.host_ = code; 587 rinfo_.host_ = code;
579 rinfo_.pc_ = code->instruction_start(); 588 rinfo_.pc_ = code->instruction_start();
580 rinfo_.data_ = 0; 589 rinfo_.data_ = 0;
581 // Relocation info is read backwards. 590 // Relocation info is read backwards.
582 pos_ = code->relocation_start() + code->relocation_size(); 591 pos_ = code->relocation_start() + code->relocation_size();
583 end_ = code->relocation_start(); 592 end_ = code->relocation_start();
584 done_ = false; 593 done_ = false;
585 mode_mask_ = mode_mask; 594 mode_mask_ = mode_mask;
586 last_id_ = 0; 595 last_id_ = 0;
587 last_position_ = 0; 596 last_position_ = 0;
597 byte* sequence = code->FindCodeAgeSequence();
598 if (sequence != NULL && !Code::IsYoungSequence(sequence)) {
599 code_age_sequence_ = sequence;
600 } else {
601 code_age_sequence_ = NULL;
602 }
588 if (mode_mask_ == 0) pos_ = end_; 603 if (mode_mask_ == 0) pos_ = end_;
589 next(); 604 next();
590 } 605 }
591 606
592 607
593 RelocIterator::RelocIterator(const CodeDesc& desc, int mode_mask) { 608 RelocIterator::RelocIterator(const CodeDesc& desc, int mode_mask) {
594 rinfo_.pc_ = desc.buffer; 609 rinfo_.pc_ = desc.buffer;
595 rinfo_.data_ = 0; 610 rinfo_.data_ = 0;
596 // Relocation info is read backwards. 611 // Relocation info is read backwards.
597 pos_ = desc.buffer + desc.buffer_size; 612 pos_ = desc.buffer + desc.buffer_size;
598 end_ = pos_ - desc.reloc_size; 613 end_ = pos_ - desc.reloc_size;
599 done_ = false; 614 done_ = false;
600 mode_mask_ = mode_mask; 615 mode_mask_ = mode_mask;
601 last_id_ = 0; 616 last_id_ = 0;
602 last_position_ = 0; 617 last_position_ = 0;
618 code_age_sequence_ = NULL;
603 if (mode_mask_ == 0) pos_ = end_; 619 if (mode_mask_ == 0) pos_ = end_;
604 next(); 620 next();
605 } 621 }
606 622
607 623
608 // ----------------------------------------------------------------------------- 624 // -----------------------------------------------------------------------------
609 // Implementation of RelocInfo 625 // Implementation of RelocInfo
610 626
611 627
612 #ifdef ENABLE_DISASSEMBLER 628 #ifdef ENABLE_DISASSEMBLER
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
645 return "external reference"; 661 return "external reference";
646 case RelocInfo::INTERNAL_REFERENCE: 662 case RelocInfo::INTERNAL_REFERENCE:
647 return "internal reference"; 663 return "internal reference";
648 case RelocInfo::CONST_POOL: 664 case RelocInfo::CONST_POOL:
649 return "constant pool"; 665 return "constant pool";
650 case RelocInfo::DEBUG_BREAK_SLOT: 666 case RelocInfo::DEBUG_BREAK_SLOT:
651 #ifndef ENABLE_DEBUGGER_SUPPORT 667 #ifndef ENABLE_DEBUGGER_SUPPORT
652 UNREACHABLE(); 668 UNREACHABLE();
653 #endif 669 #endif
654 return "debug break slot"; 670 return "debug break slot";
671 case RelocInfo::CODE_AGE_SEQUENCE:
672 return "code_age_sequence";
655 case RelocInfo::NUMBER_OF_MODES: 673 case RelocInfo::NUMBER_OF_MODES:
656 UNREACHABLE(); 674 UNREACHABLE();
657 return "number_of_modes"; 675 return "number_of_modes";
658 } 676 }
659 return "unknown relocation type"; 677 return "unknown relocation type";
660 } 678 }
661 679
662 680
663 void RelocInfo::Print(FILE* out) { 681 void RelocInfo::Print(FILE* out) {
664 PrintF(out, "%p %s", pc_, RelocModeName(rmode_)); 682 PrintF(out, "%p %s", pc_, RelocModeName(rmode_));
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
732 case STATEMENT_POSITION: 750 case STATEMENT_POSITION:
733 case EXTERNAL_REFERENCE: 751 case EXTERNAL_REFERENCE:
734 case INTERNAL_REFERENCE: 752 case INTERNAL_REFERENCE:
735 case CONST_POOL: 753 case CONST_POOL:
736 case DEBUG_BREAK_SLOT: 754 case DEBUG_BREAK_SLOT:
737 case NONE: 755 case NONE:
738 break; 756 break;
739 case NUMBER_OF_MODES: 757 case NUMBER_OF_MODES:
740 UNREACHABLE(); 758 UNREACHABLE();
741 break; 759 break;
760 case CODE_AGE_SEQUENCE:
761 ASSERT(Code::IsYoungSequence(pc_) || code_age_stub()->IsCode());
762 break;
742 } 763 }
743 } 764 }
744 #endif // DEBUG 765 #endif // DEBUG
745 766
746 767
747 // ----------------------------------------------------------------------------- 768 // -----------------------------------------------------------------------------
748 // Implementation of ExternalReference 769 // Implementation of ExternalReference
749 770
750 void ExternalReference::SetUp() { 771 void ExternalReference::SetUp() {
751 double_constants.min_int = kMinInt; 772 double_constants.min_int = kMinInt;
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 return ExternalReference(Redirect(isolate, FUNCTION_ADDR(V8::Random))); 888 return ExternalReference(Redirect(isolate, FUNCTION_ADDR(V8::Random)));
868 } 889 }
869 890
870 891
871 ExternalReference ExternalReference::get_date_field_function( 892 ExternalReference ExternalReference::get_date_field_function(
872 Isolate* isolate) { 893 Isolate* isolate) {
873 return ExternalReference(Redirect(isolate, FUNCTION_ADDR(JSDate::GetField))); 894 return ExternalReference(Redirect(isolate, FUNCTION_ADDR(JSDate::GetField)));
874 } 895 }
875 896
876 897
898 ExternalReference ExternalReference::get_make_code_young_function(
899 Isolate* isolate) {
900 return ExternalReference(Redirect(
901 isolate, FUNCTION_ADDR(Code::MakeCodeAgeSequenceYoung)));
902 }
903
904
877 ExternalReference ExternalReference::date_cache_stamp(Isolate* isolate) { 905 ExternalReference ExternalReference::date_cache_stamp(Isolate* isolate) {
878 return ExternalReference(isolate->date_cache()->stamp_address()); 906 return ExternalReference(isolate->date_cache()->stamp_address());
879 } 907 }
880 908
881 909
882 ExternalReference ExternalReference::transcendental_cache_array_address( 910 ExternalReference ExternalReference::transcendental_cache_array_address(
883 Isolate* isolate) { 911 Isolate* isolate) {
884 return ExternalReference( 912 return ExternalReference(
885 isolate->transcendental_cache()->cache_array_address()); 913 isolate->transcendental_cache()->cache_array_address());
886 } 914 }
(...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after
1366 assembler_->RecordRelocInfo(RelocInfo::POSITION, state_.current_position); 1394 assembler_->RecordRelocInfo(RelocInfo::POSITION, state_.current_position);
1367 state_.written_position = state_.current_position; 1395 state_.written_position = state_.current_position;
1368 written = true; 1396 written = true;
1369 } 1397 }
1370 1398
1371 // Return whether something was written. 1399 // Return whether something was written.
1372 return written; 1400 return written;
1373 } 1401 }
1374 1402
1375 } } // namespace v8::internal 1403 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/assembler.h ('k') | src/builtins.h » ('j') | src/mark-compact.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698