Chromium Code Reviews| 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); |
| } |