Index: src/assembler.cc |
diff --git a/src/assembler.cc b/src/assembler.cc |
index e6aaa914bfe308e290f60f79718d3d750d9b005d..eec0398539c85d9c70788f6a85549413b27319f8 100644 |
--- a/src/assembler.cc |
+++ b/src/assembler.cc |
@@ -380,23 +380,24 @@ void RelocInfoWriter::WriteExtraTaggedPC(uint32_t pc_delta, int extra_tag) { |
} |
-void RelocInfoWriter::WriteExtraTaggedIntData(int data_delta, int top_tag) { |
- WriteExtraTag(kDataJumpExtraTag, top_tag); |
+void RelocInfoWriter::WriteInt(int number) { |
for (int i = 0; i < kIntSize; i++) { |
- *--pos_ = static_cast<byte>(data_delta); |
+ *--pos_ = static_cast<byte>(number); |
// Signed right shift is arithmetic shift. Tested in test-utils.cc. |
- data_delta = data_delta >> kBitsPerByte; |
+ number = number >> kBitsPerByte; |
} |
} |
+void RelocInfoWriter::WriteExtraTaggedIntData(int data_delta, int top_tag) { |
+ WriteExtraTag(kDataJumpExtraTag, top_tag); |
+ WriteInt(data_delta); |
+} |
+ |
+ |
void RelocInfoWriter::WriteExtraTaggedPoolData(int data, int pool_type) { |
WriteExtraTag(kPoolExtraTag, pool_type); |
- for (int i = 0; i < kIntSize; i++) { |
- *--pos_ = static_cast<byte>(data); |
- // Signed right shift is arithmetic shift. Tested in test-utils.cc. |
- data = data >> kBitsPerByte; |
- } |
+ WriteInt(data); |
} |
@@ -498,10 +499,10 @@ void RelocInfoWriter::Write(const RelocInfo* rinfo) { |
WriteExtraTaggedData(rinfo->data(), kCommentTag); |
DCHECK(begin_pos - pos_ >= RelocInfo::kMinRelocCommentSize); |
} else if (RelocInfo::IsConstPool(rmode) || RelocInfo::IsVeneerPool(rmode)) { |
- WriteExtraTaggedPC(pc_delta, kPCJumpExtraTag); |
- WriteExtraTaggedPoolData(static_cast<int>(rinfo->data()), |
- RelocInfo::IsConstPool(rmode) ? kConstPoolTag |
- : kVeneerPoolTag); |
+ WriteExtraTaggedPC(pc_delta, kPCJumpExtraTag); |
+ WriteExtraTaggedPoolData( |
+ static_cast<int>(rinfo->data()), |
+ RelocInfo::IsConstPool(rmode) ? kConstPoolTag : kVeneerPoolTag); |
} else { |
DCHECK(rmode > RelocInfo::LAST_COMPACT_ENUM); |
DCHECK(rmode <= RelocInfo::LAST_STANDARD_NONCOMPACT_ENUM); |
@@ -513,6 +514,9 @@ void RelocInfoWriter::Write(const RelocInfo* rinfo) { |
// None of these modes need a data component. |
DCHECK(0 <= saved_mode && saved_mode < kPoolExtraTag); |
WriteExtraTaggedPC(pc_delta, saved_mode); |
+ if (RelocInfo::IsDebugBreakSlot(rmode)) { |
ulan
2015/07/07 13:31:31
Let's make it into a method with descriptive name
Yang
2015/07/07 14:39:00
Done.
|
+ WriteInt(reinterpret_cast<int>(rinfo->data())); |
+ } |
} |
last_pc_ = rinfo->pc(); |
last_mode_ = rmode; |
@@ -557,7 +561,7 @@ void RelocIterator::AdvanceReadId() { |
} |
-void RelocIterator::AdvanceReadPoolData() { |
+void RelocIterator::AdvanceReadInt() { |
int x = 0; |
for (int i = 0; i < kIntSize; i++) { |
x |= static_cast<int>(*--pos_) << i * kBitsPerByte; |
@@ -712,14 +716,19 @@ void RelocIterator::next() { |
RelocInfo::Mode rmode = (pool_type == kConstPoolTag) ? |
RelocInfo::CONST_POOL : RelocInfo::VENEER_POOL; |
if (SetMode(rmode)) { |
- AdvanceReadPoolData(); |
+ AdvanceReadInt(); |
ulan
2015/07/07 13:31:31
The old name was more discriptive: AdvanceReadPool
Yang
2015/07/07 14:39:00
Done.
|
return; |
} |
Advance(kIntSize); |
} else { |
AdvanceReadPC(); |
- int rmode = extra_tag + RelocInfo::LAST_COMPACT_ENUM + 1; |
- if (SetMode(static_cast<RelocInfo::Mode>(rmode))) return; |
+ RelocInfo::Mode rmode = static_cast<RelocInfo::Mode>( |
+ extra_tag + RelocInfo::LAST_COMPACT_ENUM + 1); |
+ if (RelocInfo::IsDebugBreakSlot(rmode)) { |
ulan
2015/07/07 13:31:31
Let's extract this into a separate function "Advan
Yang
2015/07/07 14:38:59
Done.
|
+ if (SetMode(rmode)) return AdvanceReadInt(); |
+ Advance(kIntSize); |
+ } |
+ if (SetMode(rmode)) return; |
} |
} |
} |
@@ -883,6 +892,12 @@ void RelocInfo::Print(Isolate* isolate, std::ostream& os) { // NOLINT |
} |
} else if (IsConstPool(rmode_)) { |
os << " (size " << static_cast<int>(data_) << ")"; |
+ } else if (IsDebugBreakSlot(rmode_)) { |
+ if (DebugBreakIsCall()) { |
+ os << " (call with " << DebugBreakCallArgumentsCount() << " args)"; |
+ } else { |
+ os << " (slot)"; |
+ } |
} |
os << "\n"; |
@@ -946,6 +961,18 @@ void RelocInfo::Verify(Isolate* isolate) { |
#endif // VERIFY_HEAP |
+bool RelocInfo::DebugBreakIsCall() { |
+ DCHECK(IsDebugBreakSlot(rmode_)); |
+ return data_ >= kDebugBreakCallArgsOffset; |
+} |
+ |
+ |
+int RelocInfo::DebugBreakCallArgumentsCount() { |
+ DCHECK(DebugBreakIsCall()); |
+ return data_ - kDebugBreakCallArgsOffset; |
+} |
+ |
+ |
// ----------------------------------------------------------------------------- |
// Implementation of ExternalReference |
@@ -1869,7 +1896,16 @@ void Assembler::RecordJSReturn() { |
void Assembler::RecordDebugBreakSlot() { |
EnsureSpace ensure_space(this); |
- RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT); |
+ intptr_t data = reinterpret_cast<intptr_t>(RelocInfo::kDebugBreakNonCallArgs); |
+ RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT, data); |
+} |
+ |
+ |
+void Assembler::RecordDebugBreakSlotForCall(int argc) { |
+ EnsureSpace ensure_space(this); |
+ intptr_t data = |
+ reinterpret_cast<intptr_t>(argc + RelocInfo::kDebugBreakCallArgsOffset); |
+ RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT, data); |
} |