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.

Reply via email to