Index: src/assembler.cc |
diff --git a/src/assembler.cc b/src/assembler.cc |
index deabe3b776a9377e10f0f4d3346946ab036c10af..4c5eda198106e5c9ef9bac136788e5188dad9b84 100644 |
--- a/src/assembler.cc |
+++ b/src/assembler.cc |
@@ -256,6 +256,7 @@ int Label::pos() const { |
// position: 01 |
// statement_position: 10 |
// comment: 11 (not used in short_data_record) |
+// deopt_reason: 11 (not used in long_data_record) |
// |
// Long record format: |
// 4-bit middle_tag: |
@@ -328,6 +329,10 @@ const int kNonstatementPositionTag = 1; |
const int kStatementPositionTag = 2; |
const int kCommentTag = 3; |
+// Reuse the same value for deopt reason tag in short record format. |
+// It is possible because we use kCommentTag only for the long record format. |
+const int kDeoptReasonTag = 3; |
+ |
const int kPoolExtraTag = kPCJumpExtraTag - 2; |
const int kConstPoolTag = 0; |
const int kVeneerPoolTag = 1; |
@@ -442,6 +447,10 @@ void RelocInfoWriter::Write(const RelocInfo* rinfo) { |
WriteExtraTaggedIntData(id_delta, kCodeWithIdTag); |
} |
last_id_ = static_cast<int>(rinfo->data()); |
+ } else if (rmode == RelocInfo::DEOPT_REASON) { |
+ DCHECK(rinfo->data() < (1 << kSmallDataBits)); |
+ WriteTaggedPC(pc_delta, kLocatableTag); |
+ WriteTaggedData(rinfo->data(), kDeoptReasonTag); |
} else if (RelocInfo::IsPosition(rmode)) { |
// Use signed delta-encoding for position. |
DCHECK(static_cast<int>(rinfo->data()) == rinfo->data()); |
@@ -473,7 +482,7 @@ void RelocInfoWriter::Write(const RelocInfo* rinfo) { |
int saved_mode = rmode - RelocInfo::LAST_COMPACT_ENUM; |
// For all other modes we simply use the mode as the extra tag. |
// None of these modes need a data component. |
- DCHECK(saved_mode < kPCJumpExtraTag && saved_mode < kDataJumpExtraTag); |
+ DCHECK(saved_mode < kPoolExtraTag); |
WriteExtraTaggedPC(pc_delta, saved_mode); |
} |
last_pc_ = rinfo->pc(); |
@@ -583,6 +592,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 +631,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 +799,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 +821,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 +884,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: |