Reviewers: rmcilroy,
Message:
As per comments in https://codereview.chromium.org/422063005/ I've provided
an
abstraction to fetching the break address in the case when the call
sequence may
be variable in length.
Description:
Abstract out fetching of break_address in debug mode
If the platform has a variable length call sequence
more than simple offset math is required. This can
be true with out of line constant pools on PowerPC.
BUG=
Please review this at https://codereview.chromium.org/427863003/
SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+56, -1 lines):
M src/arm/assembler-arm.h
M src/arm/assembler-arm-inl.h
M src/arm64/assembler-arm64.h
M src/arm64/assembler-arm64-inl.h
M src/debug.cc
M src/ia32/assembler-ia32.h
M src/ia32/assembler-ia32-inl.h
M src/mips/assembler-mips.h
M src/mips/assembler-mips-inl.h
M src/mips64/assembler-mips64.h
M src/mips64/assembler-mips64-inl.h
M src/x64/assembler-x64.h
M src/x64/assembler-x64-inl.h
M src/x87/assembler-x87.h
M src/x87/assembler-x87-inl.h
Index: src/arm/assembler-arm-inl.h
diff --git a/src/arm/assembler-arm-inl.h b/src/arm/assembler-arm-inl.h
index
292885d1b248d99a358db9de9d13a28ebae8cd81..0e81742d5389665fe50ef5541151d505b2c214d1
100644
--- a/src/arm/assembler-arm-inl.h
+++ b/src/arm/assembler-arm-inl.h
@@ -458,6 +458,11 @@ Address
Assembler::target_address_from_return_address(Address pc) {
}
+Address Assembler::break_address_from_break_address(Address pc) {
+ return pc - Assembler::kPatchDebugBreakSlotReturnOffset;
+}
+
+
Address Assembler::return_address_from_call_start(Address pc) {
if (IsLdrPcImmediateOffset(Memory::int32_at(pc)) |
IsLdrPpImmediateOffset(Memory::int32_at(pc))) {
Index: src/arm/assembler-arm.h
diff --git a/src/arm/assembler-arm.h b/src/arm/assembler-arm.h
index
e0b89a5d86cc2999b81609946b8f48eb386a9f29..0b826d4a89ba9b1c67f4e18e36edbb21d3c7ed7c
100644
--- a/src/arm/assembler-arm.h
+++ b/src/arm/assembler-arm.h
@@ -810,6 +810,9 @@ class Assembler : public AssemblerBase {
static const int kPatchDebugBreakSlotReturnOffset = 2 * kInstrSize;
+ // Return the code target address of the patch debug break slot
+ inline static Address break_address_from_break_address(Address pc);
+
// Difference between address of current opcode and value read from pc
// register.
static const int kPcLoadDelta = 8;
Index: src/arm64/assembler-arm64-inl.h
diff --git a/src/arm64/assembler-arm64-inl.h
b/src/arm64/assembler-arm64-inl.h
index
1454adf44c9c947f81117137f90a2598333dde64..4521e241765d0b5a7bc66a40079044e3debb1bc7
100644
--- a/src/arm64/assembler-arm64-inl.h
+++ b/src/arm64/assembler-arm64-inl.h
@@ -607,6 +607,11 @@ Address
Assembler::target_address_from_return_address(Address pc) {
}
+Address Assembler::break_address_from_break_address(Address pc) {
+ return pc - Assembler::kPatchDebugBreakSlotReturnOffset;
+}
+
+
Address Assembler::return_address_from_call_start(Address pc) {
// The call, generated by MacroAssembler::Call, is one of two possible
// sequences:
Index: src/arm64/assembler-arm64.h
diff --git a/src/arm64/assembler-arm64.h b/src/arm64/assembler-arm64.h
index
a2ab4cd09f88a3971fae5cadf739f531749ea261..87afc6af0a02e39440ed19bc2391e82400edc6f0
100644
--- a/src/arm64/assembler-arm64.h
+++ b/src/arm64/assembler-arm64.h
@@ -949,6 +949,9 @@ class Assembler : public AssemblerBase {
static const int kPatchReturnSequenceAddressOffset = 0;
static const int kPatchDebugBreakSlotAddressOffset = 0;
+ // Return the code target address of the patch debug break slot
+ inline static Address break_address_from_break_address(Address pc);
+
// Number of instructions necessary to be able to later patch it to a
call.
// See DebugCodegen::GenerateSlot() and
// BreakLocationIterator::SetDebugBreakAtSlot().
Index: src/debug.cc
diff --git a/src/debug.cc b/src/debug.cc
index
3586a1836db64cf8ae8f721af0b6bdf33bbd5982..361d0190daf38e1191e4a16efc0ad9159ad9ba8c
100644
--- a/src/debug.cc
+++ b/src/debug.cc
@@ -2317,7 +2317,7 @@ void Debug::SetAfterBreakTarget(JavaScriptFrame*
frame) {
// Find the call address in the running code. This address holds the
call to
// either a DebugBreakXXX or to the debug break return entry code if the
// break point is still active after processing the break point.
- Address addr = frame->pc() - Assembler::kPatchDebugBreakSlotReturnOffset;
+ Address addr = Assembler::break_address_from_break_address(frame->pc());
// Check if the location is at JS exit or debug break slot.
bool at_js_return = false;
Index: src/ia32/assembler-ia32-inl.h
diff --git a/src/ia32/assembler-ia32-inl.h b/src/ia32/assembler-ia32-inl.h
index
ff8978c966b2274ee0883742d5dabdf803356f07..2e2f1df829037cb2df3951647637470952551cef
100644
--- a/src/ia32/assembler-ia32-inl.h
+++ b/src/ia32/assembler-ia32-inl.h
@@ -481,6 +481,10 @@ Address
Assembler::target_address_from_return_address(Address pc) {
return pc - kCallTargetAddressOffset;
}
+Address Assembler::break_address_from_break_address(Address pc) {
+ return pc - Assembler::kPatchDebugBreakSlotReturnOffset;
+}
+
Displacement Assembler::disp_at(Label* L) {
return Displacement(long_at(L->pos()));
Index: src/ia32/assembler-ia32.h
diff --git a/src/ia32/assembler-ia32.h b/src/ia32/assembler-ia32.h
index
de8b04f84e3e27287eaf0175d322545f1ce9cc3b..f63af9387551c85db6ac7282e6066de14d2e8cd3
100644
--- a/src/ia32/assembler-ia32.h
+++ b/src/ia32/assembler-ia32.h
@@ -533,6 +533,9 @@ class Assembler : public AssemblerBase {
// to jump to.
static const int kPatchDebugBreakSlotAddressOffset = 1; // JMP imm32.
+ // Return the code target address of the patch debug break slot
+ inline static Address break_address_from_break_address(Address pc);
+
static const int kCallInstructionLength = 5;
static const int kPatchDebugBreakSlotReturnOffset = kPointerSize;
static const int kJSReturnSequenceLength = 6;
Index: src/mips/assembler-mips-inl.h
diff --git a/src/mips/assembler-mips-inl.h b/src/mips/assembler-mips-inl.h
index
cf8865b875d690db6e35dcad7fc6e74b06d425f6..502905950edbda80ad0e2edede92bdcd5b4407a1
100644
--- a/src/mips/assembler-mips-inl.h
+++ b/src/mips/assembler-mips-inl.h
@@ -190,6 +190,11 @@ Address
Assembler::target_address_from_return_address(Address pc) {
}
+Address Assembler::break_address_from_break_address(Address pc) {
+ return pc - Assembler::kPatchDebugBreakSlotReturnOffset;
+}
+
+
Object* RelocInfo::target_object() {
ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT);
return reinterpret_cast<Object*>(Assembler::target_address_at(pc_,
host_));
Index: src/mips/assembler-mips.h
diff --git a/src/mips/assembler-mips.h b/src/mips/assembler-mips.h
index
2ba3ef7166f2f9023adb77c5d128dd12a51768bc..d058fde8ed887a1ec019dc72a449e050278b5077
100644
--- a/src/mips/assembler-mips.h
+++ b/src/mips/assembler-mips.h
@@ -561,6 +561,9 @@ class Assembler : public AssemblerBase {
// to jump to.
static const int kPatchDebugBreakSlotAddressOffset = 0 * kInstrSize;
+ // Return the code target address of the patch debug break slot
+ inline static Address break_address_from_break_address(Address pc);
+
// Difference between address of current opcode and value read from pc
// register.
static const int kPcLoadDelta = 4;
Index: src/mips64/assembler-mips64-inl.h
diff --git a/src/mips64/assembler-mips64-inl.h
b/src/mips64/assembler-mips64-inl.h
index
9c6d1573a24bd1e76ca4835d5896f2950fccf530..fed45d30eb5b035ecfb66ef56ffb26ab58f05ff1
100644
--- a/src/mips64/assembler-mips64-inl.h
+++ b/src/mips64/assembler-mips64-inl.h
@@ -184,6 +184,11 @@ Address
Assembler::target_address_from_return_address(Address pc) {
}
+Address Assembler::break_address_from_break_address(Address pc) {
+ return pc - Assembler::kPatchDebugBreakSlotReturnOffset;
+}
+
+
Object* RelocInfo::target_object() {
ASSERT(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT);
return reinterpret_cast<Object*>(Assembler::target_address_at(pc_,
host_));
Index: src/mips64/assembler-mips64.h
diff --git a/src/mips64/assembler-mips64.h b/src/mips64/assembler-mips64.h
index
395ab77d8ace9116fb290d140da7a67d6ab468eb..0e3a98aeabb491ca05660b23d196bb9ceb9831a1
100644
--- a/src/mips64/assembler-mips64.h
+++ b/src/mips64/assembler-mips64.h
@@ -560,6 +560,9 @@ class Assembler : public AssemblerBase {
static const int kPatchDebugBreakSlotReturnOffset = 6 * kInstrSize;
+ // Return the code target address of the patch debug break slot
+ inline static Address break_address_from_break_address(Address pc);
+
// Number of instructions used for the JS return sequence. The constant
is
// used by the debugger to patch the JS return sequence.
static const int kJSReturnSequenceInstructions = 7;
Index: src/x64/assembler-x64-inl.h
diff --git a/src/x64/assembler-x64-inl.h b/src/x64/assembler-x64-inl.h
index
299ef29818dca9dae13701ad1a6dff67fe96f535..3596d59380f32731ad7440d69e0755ecc18d5bc8
100644
--- a/src/x64/assembler-x64-inl.h
+++ b/src/x64/assembler-x64-inl.h
@@ -206,6 +206,11 @@ Address
Assembler::target_address_from_return_address(Address pc) {
}
+Address Assembler::break_address_from_break_address(Address pc) {
+ return pc - Assembler::kPatchDebugBreakSlotReturnOffset;
+}
+
+
Handle<Object> Assembler::code_target_object_handle_at(Address pc) {
return code_targets_[Memory::int32_at(pc)];
}
Index: src/x64/assembler-x64.h
diff --git a/src/x64/assembler-x64.h b/src/x64/assembler-x64.h
index
4259e9b50ef5ccbfd5d5b8f2452b6052697a5543..686b07a4527a660703e78306aa04c8ea7fe2e2c2
100644
--- a/src/x64/assembler-x64.h
+++ b/src/x64/assembler-x64.h
@@ -592,6 +592,9 @@ class Assembler : public AssemblerBase {
static const int kRealPatchReturnSequenceAddressOffset =
kMoveAddressIntoScratchRegisterInstructionLength - kPointerSize;
+ // Return the code target address of the patch debug break slot
+ inline static Address break_address_from_break_address(Address pc);
+
// One byte opcode for test eax,0xXXXXXXXX.
static const byte kTestEaxByte = 0xA9;
// One byte opcode for test al, 0xXX.
Index: src/x87/assembler-x87-inl.h
diff --git a/src/x87/assembler-x87-inl.h b/src/x87/assembler-x87-inl.h
index
07a8751099c1c6844397332b30501f7d216a806c..98e490f7afaf85f5eb14e83f75cfc7d28e75e454
100644
--- a/src/x87/assembler-x87-inl.h
+++ b/src/x87/assembler-x87-inl.h
@@ -483,6 +483,11 @@ Address
Assembler::target_address_from_return_address(Address pc) {
}
+Address Assembler::break_address_from_break_address(Address pc) {
+ return pc - Assembler::kPatchDebugBreakSlotReturnOffset;
+}
+
+
Displacement Assembler::disp_at(Label* L) {
return Displacement(long_at(L->pos()));
}
Index: src/x87/assembler-x87.h
diff --git a/src/x87/assembler-x87.h b/src/x87/assembler-x87.h
index
162416735b0be3150e9f6efa4a95de00d3f6fd1c..1de3ddfa72a732d8434018f78d9506409f439ecd
100644
--- a/src/x87/assembler-x87.h
+++ b/src/x87/assembler-x87.h
@@ -522,6 +522,9 @@ class Assembler : public AssemblerBase {
// to jump to.
static const int kPatchDebugBreakSlotAddressOffset = 1; // JMP imm32.
+ // Return the code target address of the patch debug break slot
+ inline static Address break_address_from_break_address(Address pc);
+
static const int kCallInstructionLength = 5;
static const int kPatchDebugBreakSlotReturnOffset = kPointerSize;
static const int kJSReturnSequenceLength = 6;
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.