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

Unified Diff: src/assembler.cc

Issue 1222093007: Debugger: use debug break slot to break on call. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/assembler.h ('k') | src/full-codegen.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
« no previous file with comments | « src/assembler.h ('k') | src/full-codegen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698