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

Side by Side Diff: src/assembler.cc

Issue 874323003: Externalize deoptimization reasons. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: arm64 Created 5 years, 10 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
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 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 const int kLastChunkTag = 1; 321 const int kLastChunkTag = 1;
322 322
323 323
324 const int kDataJumpExtraTag = kPCJumpExtraTag - 1; 324 const int kDataJumpExtraTag = kPCJumpExtraTag - 1;
325 325
326 const int kCodeWithIdTag = 0; 326 const int kCodeWithIdTag = 0;
327 const int kNonstatementPositionTag = 1; 327 const int kNonstatementPositionTag = 1;
328 const int kStatementPositionTag = 2; 328 const int kStatementPositionTag = 2;
329 const int kCommentTag = 3; 329 const int kCommentTag = 3;
330 330
331 // Reuse the same value for deopt reason tag in short record format.
Michael Starzinger 2015/02/04 11:30:51 IIUC, this assumes that comments are always encode
loislo 2015/02/04 14:38:49 done
332 const int kDeoptReasonTag = 3;
333
331 const int kPoolExtraTag = kPCJumpExtraTag - 2; 334 const int kPoolExtraTag = kPCJumpExtraTag - 2;
332 const int kConstPoolTag = 0; 335 const int kConstPoolTag = 0;
333 const int kVeneerPoolTag = 1; 336 const int kVeneerPoolTag = 1;
334 337
335 338
336 uint32_t RelocInfoWriter::WriteVariableLengthPCJump(uint32_t pc_delta) { 339 uint32_t RelocInfoWriter::WriteVariableLengthPCJump(uint32_t pc_delta) {
337 // Return if the pc_delta can fit in kSmallPCDeltaBits bits. 340 // Return if the pc_delta can fit in kSmallPCDeltaBits bits.
338 // Otherwise write a variable length PC jump for the bits that do 341 // Otherwise write a variable length PC jump for the bits that do
339 // not fit in the kSmallPCDeltaBits bits. 342 // not fit in the kSmallPCDeltaBits bits.
340 if (is_uintn(pc_delta, kSmallPCDeltaBits)) return pc_delta; 343 if (is_uintn(pc_delta, kSmallPCDeltaBits)) return pc_delta;
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
416 #endif 419 #endif
417 DCHECK(rinfo->rmode() < RelocInfo::NUMBER_OF_MODES); 420 DCHECK(rinfo->rmode() < RelocInfo::NUMBER_OF_MODES);
418 DCHECK(rinfo->pc() - last_pc_ >= 0); 421 DCHECK(rinfo->pc() - last_pc_ >= 0);
419 DCHECK(RelocInfo::LAST_STANDARD_NONCOMPACT_ENUM - RelocInfo::LAST_COMPACT_ENUM 422 DCHECK(RelocInfo::LAST_STANDARD_NONCOMPACT_ENUM - RelocInfo::LAST_COMPACT_ENUM
420 <= kMaxStandardNonCompactModes); 423 <= kMaxStandardNonCompactModes);
421 // Use unsigned delta-encoding for pc. 424 // Use unsigned delta-encoding for pc.
422 uint32_t pc_delta = static_cast<uint32_t>(rinfo->pc() - last_pc_); 425 uint32_t pc_delta = static_cast<uint32_t>(rinfo->pc() - last_pc_);
423 RelocInfo::Mode rmode = rinfo->rmode(); 426 RelocInfo::Mode rmode = rinfo->rmode();
424 427
425 // The two most common modes are given small tags, and usually fit in a byte. 428 // The two most common modes are given small tags, and usually fit in a byte.
426 if (rmode == RelocInfo::EMBEDDED_OBJECT) { 429 if (rmode == RelocInfo::DEOPT_REASON) {
Michael Starzinger 2015/02/04 11:30:51 nit: Can we move this to after EMBEDDED_OBJECT, CO
loislo 2015/02/04 14:38:50 done
430 WriteTaggedPC(pc_delta, kLocatableTag);
431 WriteTaggedData(rinfo->data(), kDeoptReasonTag);
Michael Starzinger 2015/02/04 11:30:51 Can we have a DCHECK here that the deopt reason re
loislo 2015/02/04 14:38:49 done
432 } else if (rmode == RelocInfo::EMBEDDED_OBJECT) {
427 WriteTaggedPC(pc_delta, kEmbeddedObjectTag); 433 WriteTaggedPC(pc_delta, kEmbeddedObjectTag);
428 } else if (rmode == RelocInfo::CODE_TARGET) { 434 } else if (rmode == RelocInfo::CODE_TARGET) {
429 WriteTaggedPC(pc_delta, kCodeTargetTag); 435 WriteTaggedPC(pc_delta, kCodeTargetTag);
430 DCHECK(begin_pos - pos_ <= RelocInfo::kMaxCallSize); 436 DCHECK(begin_pos - pos_ <= RelocInfo::kMaxCallSize);
431 } else if (rmode == RelocInfo::CODE_TARGET_WITH_ID) { 437 } else if (rmode == RelocInfo::CODE_TARGET_WITH_ID) {
432 // Use signed delta-encoding for id. 438 // Use signed delta-encoding for id.
433 DCHECK(static_cast<int>(rinfo->data()) == rinfo->data()); 439 DCHECK(static_cast<int>(rinfo->data()) == rinfo->data());
434 int id_delta = static_cast<int>(rinfo->data()) - last_id_; 440 int id_delta = static_cast<int>(rinfo->data()) - last_id_;
435 // Check if delta is small enough to fit in a tagged byte. 441 // Check if delta is small enough to fit in a tagged byte.
436 if (is_intn(id_delta, kSmallDataBits)) { 442 if (is_intn(id_delta, kSmallDataBits)) {
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 582
577 583
578 inline void RelocIterator::ReadTaggedPosition() { 584 inline void RelocIterator::ReadTaggedPosition() {
579 int8_t signed_b = *pos_; 585 int8_t signed_b = *pos_;
580 // Signed right shift is arithmetic shift. Tested in test-utils.cc. 586 // Signed right shift is arithmetic shift. Tested in test-utils.cc.
581 last_position_ += signed_b >> kLocatableTypeTagBits; 587 last_position_ += signed_b >> kLocatableTypeTagBits;
582 rinfo_.data_ = last_position_; 588 rinfo_.data_ = last_position_;
583 } 589 }
584 590
585 591
592 inline void RelocIterator::ReadTaggedData() {
593 uint8_t unsigned_b = *pos_;
594 rinfo_.data_ = unsigned_b >> kTagBits;
595 }
596
597
586 static inline RelocInfo::Mode GetPositionModeFromTag(int tag) { 598 static inline RelocInfo::Mode GetPositionModeFromTag(int tag) {
587 DCHECK(tag == kNonstatementPositionTag || 599 DCHECK(tag == kNonstatementPositionTag ||
588 tag == kStatementPositionTag); 600 tag == kStatementPositionTag);
589 return (tag == kNonstatementPositionTag) ? 601 return (tag == kNonstatementPositionTag) ?
590 RelocInfo::POSITION : 602 RelocInfo::POSITION :
591 RelocInfo::STATEMENT_POSITION; 603 RelocInfo::STATEMENT_POSITION;
592 } 604 }
593 605
594 606
595 void RelocIterator::next() { 607 void RelocIterator::next() {
(...skipping 13 matching lines...) Expand all
609 if (SetMode(RelocInfo::CODE_TARGET)) return; 621 if (SetMode(RelocInfo::CODE_TARGET)) return;
610 } else if (tag == kLocatableTag) { 622 } else if (tag == kLocatableTag) {
611 ReadTaggedPC(); 623 ReadTaggedPC();
612 Advance(); 624 Advance();
613 int locatable_tag = GetLocatableTypeTag(); 625 int locatable_tag = GetLocatableTypeTag();
614 if (locatable_tag == kCodeWithIdTag) { 626 if (locatable_tag == kCodeWithIdTag) {
615 if (SetMode(RelocInfo::CODE_TARGET_WITH_ID)) { 627 if (SetMode(RelocInfo::CODE_TARGET_WITH_ID)) {
616 ReadTaggedId(); 628 ReadTaggedId();
617 return; 629 return;
618 } 630 }
631 } else if (locatable_tag == kDeoptReasonTag) {
632 ReadTaggedData();
633 if (SetMode(RelocInfo::DEOPT_REASON)) return;
619 } else { 634 } else {
620 // Compact encoding is never used for comments,
621 // so it must be a position.
622 DCHECK(locatable_tag == kNonstatementPositionTag || 635 DCHECK(locatable_tag == kNonstatementPositionTag ||
623 locatable_tag == kStatementPositionTag); 636 locatable_tag == kStatementPositionTag);
624 if (mode_mask_ & RelocInfo::kPositionMask) { 637 if (mode_mask_ & RelocInfo::kPositionMask) {
625 ReadTaggedPosition(); 638 ReadTaggedPosition();
626 if (SetMode(GetPositionModeFromTag(locatable_tag))) return; 639 if (SetMode(GetPositionModeFromTag(locatable_tag))) return;
627 } 640 }
628 } 641 }
629 } else { 642 } else {
630 DCHECK(tag == kDefaultTag); 643 DCHECK(tag == kDefaultTag);
631 int extra_tag = GetExtraTag(); 644 int extra_tag = GetExtraTag();
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
776 case RelocInfo::COMMENT: 789 case RelocInfo::COMMENT:
777 return "comment"; 790 return "comment";
778 case RelocInfo::POSITION: 791 case RelocInfo::POSITION:
779 return "position"; 792 return "position";
780 case RelocInfo::STATEMENT_POSITION: 793 case RelocInfo::STATEMENT_POSITION:
781 return "statement position"; 794 return "statement position";
782 case RelocInfo::EXTERNAL_REFERENCE: 795 case RelocInfo::EXTERNAL_REFERENCE:
783 return "external reference"; 796 return "external reference";
784 case RelocInfo::INTERNAL_REFERENCE: 797 case RelocInfo::INTERNAL_REFERENCE:
785 return "internal reference"; 798 return "internal reference";
799 case RelocInfo::DEOPT_REASON:
800 return "deopt reason";
786 case RelocInfo::CONST_POOL: 801 case RelocInfo::CONST_POOL:
787 return "constant pool"; 802 return "constant pool";
788 case RelocInfo::VENEER_POOL: 803 case RelocInfo::VENEER_POOL:
789 return "veneer pool"; 804 return "veneer pool";
790 case RelocInfo::DEBUG_BREAK_SLOT: 805 case RelocInfo::DEBUG_BREAK_SLOT:
791 return "debug break slot"; 806 return "debug break slot";
792 case RelocInfo::CODE_AGE_SEQUENCE: 807 case RelocInfo::CODE_AGE_SEQUENCE:
793 return "code_age_sequence"; 808 return "code_age_sequence";
794 case RelocInfo::NUMBER_OF_MODES: 809 case RelocInfo::NUMBER_OF_MODES:
795 UNREACHABLE(); 810 UNREACHABLE();
796 return "number_of_modes"; 811 return "number_of_modes";
797 } 812 }
798 return "unknown relocation type"; 813 return "unknown relocation type";
799 } 814 }
800 815
801 816
802 void RelocInfo::Print(Isolate* isolate, std::ostream& os) { // NOLINT 817 void RelocInfo::Print(Isolate* isolate, std::ostream& os) { // NOLINT
803 os << static_cast<const void*>(pc_) << " " << RelocModeName(rmode_); 818 os << static_cast<const void*>(pc_) << " " << RelocModeName(rmode_);
804 if (IsComment(rmode_)) { 819 if (IsComment(rmode_)) {
805 os << " (" << reinterpret_cast<char*>(data_) << ")"; 820 os << " (" << reinterpret_cast<char*>(data_) << ")";
821 } else if (rmode_ == DEOPT_REASON) {
822 os << " (" << Deoptimizer::GetDeoptReason(
823 static_cast<Deoptimizer::DeoptReason>(data_)) << ")";
806 } else if (rmode_ == EMBEDDED_OBJECT) { 824 } else if (rmode_ == EMBEDDED_OBJECT) {
807 os << " (" << Brief(target_object()) << ")"; 825 os << " (" << Brief(target_object()) << ")";
808 } else if (rmode_ == EXTERNAL_REFERENCE) { 826 } else if (rmode_ == EXTERNAL_REFERENCE) {
809 ExternalReferenceEncoder ref_encoder(isolate); 827 ExternalReferenceEncoder ref_encoder(isolate);
810 os << " (" << ref_encoder.NameOfAddress(target_reference()) << ") (" 828 os << " (" << ref_encoder.NameOfAddress(target_reference()) << ") ("
811 << static_cast<const void*>(target_reference()) << ")"; 829 << static_cast<const void*>(target_reference()) << ")";
812 } else if (IsCodeTarget(rmode_)) { 830 } else if (IsCodeTarget(rmode_)) {
813 Code* code = Code::GetCodeFromTargetAddress(target_address()); 831 Code* code = Code::GetCodeFromTargetAddress(target_address());
814 os << " (" << Code::Kind2String(code->kind()) << ") (" 832 os << " (" << Code::Kind2String(code->kind()) << ") ("
815 << static_cast<const void*>(target_address()) << ")"; 833 << static_cast<const void*>(target_address()) << ")";
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
856 CHECK(code->address() == HeapObject::cast(found)->address()); 874 CHECK(code->address() == HeapObject::cast(found)->address());
857 break; 875 break;
858 } 876 }
859 case RUNTIME_ENTRY: 877 case RUNTIME_ENTRY:
860 case JS_RETURN: 878 case JS_RETURN:
861 case COMMENT: 879 case COMMENT:
862 case POSITION: 880 case POSITION:
863 case STATEMENT_POSITION: 881 case STATEMENT_POSITION:
864 case EXTERNAL_REFERENCE: 882 case EXTERNAL_REFERENCE:
865 case INTERNAL_REFERENCE: 883 case INTERNAL_REFERENCE:
884 case DEOPT_REASON:
866 case CONST_POOL: 885 case CONST_POOL:
867 case VENEER_POOL: 886 case VENEER_POOL:
868 case DEBUG_BREAK_SLOT: 887 case DEBUG_BREAK_SLOT:
869 case NONE32: 888 case NONE32:
870 case NONE64: 889 case NONE64:
871 break; 890 break;
872 case NUMBER_OF_MODES: 891 case NUMBER_OF_MODES:
873 UNREACHABLE(); 892 UNREACHABLE();
874 break; 893 break;
875 case CODE_AGE_SEQUENCE: 894 case CODE_AGE_SEQUENCE:
(...skipping 715 matching lines...) Expand 10 before | Expand all | Expand 10 after
1591 assembler_->RecordRelocInfo(RelocInfo::POSITION, state_.current_position); 1610 assembler_->RecordRelocInfo(RelocInfo::POSITION, state_.current_position);
1592 state_.written_position = state_.current_position; 1611 state_.written_position = state_.current_position;
1593 written = true; 1612 written = true;
1594 } 1613 }
1595 1614
1596 // Return whether something was written. 1615 // Return whether something was written.
1597 return written; 1616 return written;
1598 } 1617 }
1599 1618
1600 } } // namespace v8::internal 1619 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/assembler.h ('k') | src/code-stubs-hydrogen.cc » ('j') | src/ia32/assembler-ia32.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698