Abstract out fetching of break_address in debug mode
authoryangguo@chromium.org <yangguo@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 6 Aug 2014 13:56:58 +0000 (13:56 +0000)
committeryangguo@chromium.org <yangguo@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 6 Aug 2014 13:56:58 +0000 (13:56 +0000)
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=
R=yangguo@chromium.org

Review URL: https://codereview.chromium.org/427863003

Patch from Andrew Low <andrew_low@ca.ibm.com>.

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22935 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

15 files changed:
src/arm/assembler-arm-inl.h
src/arm/assembler-arm.h
src/arm64/assembler-arm64-inl.h
src/arm64/assembler-arm64.h
src/debug.cc
src/ia32/assembler-ia32-inl.h
src/ia32/assembler-ia32.h
src/mips/assembler-mips-inl.h
src/mips/assembler-mips.h
src/mips64/assembler-mips64-inl.h
src/mips64/assembler-mips64.h
src/x64/assembler-x64-inl.h
src/x64/assembler-x64.h
src/x87/assembler-x87-inl.h
src/x87/assembler-x87.h

index 1753cc755ac7cd8aa5e7dde4a5ec95ca44151312..1cfe34b241fc1ab804032d2babe2126afec9eab2 100644 (file)
@@ -458,6 +458,11 @@ Address Assembler::target_address_from_return_address(Address pc) {
 }
 
 
+Address Assembler::break_address_from_return_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 3b348b344c605a67f6bc771ab4f5633b280869da..2950264f097036e9c62dcb56c66c2f438edbfe19 100644 (file)
@@ -781,6 +781,9 @@ class Assembler : public AssemblerBase {
   // in the instruction stream that the call will return from.
   INLINE(static Address return_address_from_call_start(Address pc));
 
+  // Return the code target address of the patch debug break slot
+  INLINE(static Address break_address_from_return_address(Address pc));
+
   // This sets the branch destination (which is in the constant pool on ARM).
   // This is for calls and branches within generated code.
   inline static void deserialization_set_special_target_at(
index e3cdfcb30529ae2be7e31a787871aa3519fe3696..3b24197ebf3691d07afa53b8b33c240e22258ddc 100644 (file)
@@ -607,6 +607,11 @@ Address Assembler::target_address_from_return_address(Address pc) {
 }
 
 
+Address Assembler::break_address_from_return_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 e2291622b632907bc636c48869bc7046c3f0905c..e16ea875c47288bfa2d51e1c36ac13e3db91c251 100644 (file)
@@ -887,6 +887,9 @@ class Assembler : public AssemblerBase {
   // instruction stream that call will return from.
   inline static Address return_address_from_call_start(Address pc);
 
+  // Return the code target address of the patch debug break slot
+  inline static Address break_address_from_return_address(Address pc);
+
   // This sets the branch destination (which is in the constant pool on ARM).
   // This is for calls and branches within generated code.
   inline static void deserialization_set_special_target_at(
index c6b936c33ba27abaf3c7a53fe89d2f6c827bc1bf..dec51b9954a5d15cfb04536cd317964335f9c0e8 100644 (file)
@@ -2326,7 +2326,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_return_address(frame->pc());
 
   // Check if the location is at JS exit or debug break slot.
   bool at_js_return = false;
@@ -2417,7 +2417,7 @@ bool Debug::IsBreakAtReturn(JavaScriptFrame* frame) {
 #endif
 
   // Find the call address in the running code.
-  Address addr = frame->pc() - Assembler::kPatchDebugBreakSlotReturnOffset;
+  Address addr = Assembler::break_address_from_return_address(frame->pc());
 
   // Check if the location is at JS return.
   RelocIterator it(debug_info->code());
index 09f1de60291a49e9e1421c5899cfa85ba2a54781..c7ec6d9918c2d371fe9c5cec43e2c8a0522401be 100644 (file)
@@ -482,6 +482,11 @@ Address Assembler::target_address_from_return_address(Address pc) {
 }
 
 
+Address Assembler::break_address_from_return_address(Address pc) {
+  return pc - Assembler::kPatchDebugBreakSlotReturnOffset;
+}
+
+
 Displacement Assembler::disp_at(Label* L) {
   return Displacement(long_at(L->pos()));
 }
index f1cfcdd38d7f2a878a8f208404584be41e5fd991..5febffd8c389dffcdced09d437e0c9a17399dc0f 100644 (file)
@@ -519,6 +519,9 @@ class Assembler : public AssemblerBase {
   // of that call in the instruction stream.
   inline static Address target_address_from_return_address(Address pc);
 
+  // Return the code target address of the patch debug break slot
+  inline static Address break_address_from_return_address(Address pc);
+
   // This sets the branch destination (which is in the instruction on x86).
   // This is for calls and branches within generated code.
   inline static void deserialization_set_special_target_at(
index db986f5eff1234001e2725f220dd6944b412e706..2666f6ada7c0006999fb2c9fd12f3a4c7bb8cec2 100644 (file)
@@ -190,6 +190,11 @@ Address Assembler::target_address_from_return_address(Address pc) {
 }
 
 
+Address Assembler::break_address_from_return_address(Address pc) {
+  return pc - Assembler::kPatchDebugBreakSlotReturnOffset;
+}
+
+
 Object* RelocInfo::target_object() {
   DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT);
   return reinterpret_cast<Object*>(Assembler::target_address_at(pc_, host_));
index 47a0e59c9da82f1464881d9799c9fecafc16fdfc..8469c1ca182b883a0a1c36a103f85a98a459e5f8 100644 (file)
@@ -511,6 +511,9 @@ class Assembler : public AssemblerBase {
   // of that call in the instruction stream.
   inline static Address target_address_from_return_address(Address pc);
 
+  // Return the code target address of the patch debug break slot
+  inline static Address break_address_from_return_address(Address pc);
+
   static void JumpLabelToJumpRegister(Address pc);
 
   static void QuietNaN(HeapObject* nan);
index 436912bc86869fcc25c1c9903cf0944b5677713c..de294ee6653408126d85bd46a4016623626fa497 100644 (file)
@@ -184,6 +184,11 @@ Address Assembler::target_address_from_return_address(Address pc) {
 }
 
 
+Address Assembler::break_address_from_return_address(Address pc) {
+  return pc - Assembler::kPatchDebugBreakSlotReturnOffset;
+}
+
+
 Object* RelocInfo::target_object() {
   DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT);
   return reinterpret_cast<Object*>(Assembler::target_address_at(pc_, host_));
index 89f7f03faed495ecf6be23bfe42dd47d0570e6f9..5c754f495054bafffc8e2935ac973c9832577a36 100644 (file)
@@ -512,6 +512,9 @@ class Assembler : public AssemblerBase {
   // of that call in the instruction stream.
   inline static Address target_address_from_return_address(Address pc);
 
+  // Return the code target address of the patch debug break slot
+  inline static Address break_address_from_return_address(Address pc);
+
   static void JumpLabelToJumpRegister(Address pc);
 
   static void QuietNaN(HeapObject* nan);
index 9e84cedafee738b2eee4ff3f02fa27b650dc9ae3..b64bbfb664f55797d179ac6e2beab1ce1c33fc74 100644 (file)
@@ -206,6 +206,11 @@ Address Assembler::target_address_from_return_address(Address pc) {
 }
 
 
+Address Assembler::break_address_from_return_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 06bf8509af279082b1e7be86ac7d1d958e1b62b9..3896f8923daa6ede6316567d253ddd7f11ee0930 100644 (file)
@@ -539,6 +539,9 @@ class Assembler : public AssemblerBase {
   // of that call in the instruction stream.
   static inline Address target_address_from_return_address(Address pc);
 
+  // Return the code target address of the patch debug break slot
+  inline static Address break_address_from_return_address(Address pc);
+
   // This sets the branch destination (which is in the instruction on x64).
   // This is for calls and branches within generated code.
   inline static void deserialization_set_special_target_at(
index a226521128ee073547e240618eceb3cd834f620a..25ecfcf13791b2203528a7581d2e1f87a9e4ef42 100644 (file)
@@ -483,6 +483,11 @@ Address Assembler::target_address_from_return_address(Address pc) {
 }
 
 
+Address Assembler::break_address_from_return_address(Address pc) {
+  return pc - Assembler::kPatchDebugBreakSlotReturnOffset;
+}
+
+
 Displacement Assembler::disp_at(Label* L) {
   return Displacement(long_at(L->pos()));
 }
index ac0fca14d0cfabc72f67f8b732c445a18c4bb62b..a2bedcc3cc501d00d8e0a3e74dd3c6b132fc98ba 100644 (file)
@@ -508,6 +508,9 @@ class Assembler : public AssemblerBase {
   // of that call in the instruction stream.
   inline static Address target_address_from_return_address(Address pc);
 
+  // Return the code target address of the patch debug break slot
+  inline static Address break_address_from_return_address(Address pc);
+
   // This sets the branch destination (which is in the instruction on x86).
   // This is for calls and branches within generated code.
   inline static void deserialization_set_special_target_at(