Chromium Code Reviews| Index: src/assembler.cc |
| diff --git a/src/assembler.cc b/src/assembler.cc |
| index deabe3b776a9377e10f0f4d3346946ab036c10af..0c7e58f6f0edeed38959df69c18751c13156c3d4 100644 |
| --- a/src/assembler.cc |
| +++ b/src/assembler.cc |
| @@ -328,6 +328,9 @@ const int kNonstatementPositionTag = 1; |
| const int kStatementPositionTag = 2; |
| const int kCommentTag = 3; |
| +// 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
|
| +const int kDeoptReasonTag = 3; |
| + |
| const int kPoolExtraTag = kPCJumpExtraTag - 2; |
| const int kConstPoolTag = 0; |
| const int kVeneerPoolTag = 1; |
| @@ -423,7 +426,10 @@ void RelocInfoWriter::Write(const RelocInfo* rinfo) { |
| RelocInfo::Mode rmode = rinfo->rmode(); |
| // The two most common modes are given small tags, and usually fit in a byte. |
| - if (rmode == RelocInfo::EMBEDDED_OBJECT) { |
| + 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
|
| + WriteTaggedPC(pc_delta, kLocatableTag); |
| + 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
|
| + } else if (rmode == RelocInfo::EMBEDDED_OBJECT) { |
| WriteTaggedPC(pc_delta, kEmbeddedObjectTag); |
| } else if (rmode == RelocInfo::CODE_TARGET) { |
| WriteTaggedPC(pc_delta, kCodeTargetTag); |
| @@ -583,6 +589,12 @@ inline void RelocIterator::ReadTaggedPosition() { |
| } |
| +inline void RelocIterator::ReadTaggedData() { |
| + uint8_t unsigned_b = *pos_; |
| + rinfo_.data_ = unsigned_b >> kTagBits; |
| +} |
| + |
| + |
| static inline RelocInfo::Mode GetPositionModeFromTag(int tag) { |
| DCHECK(tag == kNonstatementPositionTag || |
| tag == kStatementPositionTag); |
| @@ -616,9 +628,10 @@ void RelocIterator::next() { |
| ReadTaggedId(); |
| return; |
| } |
| + } else if (locatable_tag == kDeoptReasonTag) { |
| + ReadTaggedData(); |
| + if (SetMode(RelocInfo::DEOPT_REASON)) return; |
| } else { |
| - // Compact encoding is never used for comments, |
| - // so it must be a position. |
| DCHECK(locatable_tag == kNonstatementPositionTag || |
| locatable_tag == kStatementPositionTag); |
| if (mode_mask_ & RelocInfo::kPositionMask) { |
| @@ -783,6 +796,8 @@ const char* RelocInfo::RelocModeName(RelocInfo::Mode rmode) { |
| return "external reference"; |
| case RelocInfo::INTERNAL_REFERENCE: |
| return "internal reference"; |
| + case RelocInfo::DEOPT_REASON: |
| + return "deopt reason"; |
| case RelocInfo::CONST_POOL: |
| return "constant pool"; |
| case RelocInfo::VENEER_POOL: |
| @@ -803,6 +818,9 @@ void RelocInfo::Print(Isolate* isolate, std::ostream& os) { // NOLINT |
| os << static_cast<const void*>(pc_) << " " << RelocModeName(rmode_); |
| if (IsComment(rmode_)) { |
| os << " (" << reinterpret_cast<char*>(data_) << ")"; |
| + } else if (rmode_ == DEOPT_REASON) { |
| + os << " (" << Deoptimizer::GetDeoptReason( |
| + static_cast<Deoptimizer::DeoptReason>(data_)) << ")"; |
| } else if (rmode_ == EMBEDDED_OBJECT) { |
| os << " (" << Brief(target_object()) << ")"; |
| } else if (rmode_ == EXTERNAL_REFERENCE) { |
| @@ -863,6 +881,7 @@ void RelocInfo::Verify(Isolate* isolate) { |
| case STATEMENT_POSITION: |
| case EXTERNAL_REFERENCE: |
| case INTERNAL_REFERENCE: |
| + case DEOPT_REASON: |
| case CONST_POOL: |
| case VENEER_POOL: |
| case DEBUG_BREAK_SLOT: |