Bug 1233863 - ARM64: Avoid BumpSystemStackPointer(). r?sstangl draft
authorJakob Stoklund Olesen <jolesen@mozilla.com>
Fri, 18 Dec 2015 15:40:14 -0800
changeset 316452 0ae1b450100537af1bc7f971592572a9de0e7ee9
parent 316451 2804fa795970332c5da6d62678346f3be21e81c1
child 316453 4b3288217339983fb4927b7eb36ed6775b997727
push id8559
push userjolesen@mozilla.com
push dateFri, 18 Dec 2015 23:39:48 +0000
reviewerssstangl
bugs1233863
milestone46.0a1
Bug 1233863 - ARM64: Avoid BumpSystemStackPointer(). r?sstangl This function can only handle small immediate adjustments to the stack pointer because it is not allowed to use scratch registers. Don't call it from MacroAssembler::Claim() which may allocate large stack frames. Simply synchronize the system stack pointer to the pseudo stack pointer instead.
js/src/jit/arm64/vixl/MacroAssembler-vixl.cpp
--- a/js/src/jit/arm64/vixl/MacroAssembler-vixl.cpp
+++ b/js/src/jit/arm64/vixl/MacroAssembler-vixl.cpp
@@ -1559,21 +1559,23 @@ void MacroAssembler::Claim(const Operand
 
   if (size.IsImmediate()) {
     VIXL_ASSERT(size.immediate() > 0);
     if (sp.Is(GetStackPointer64())) {
       VIXL_ASSERT((size.immediate() % 16) == 0);
     }
   }
 
-  if (!sp.Is(GetStackPointer64())) {
-    BumpSystemStackPointer(size);
-  }
+  Sub(GetStackPointer64(), GetStackPointer64(), size);
 
-  Sub(GetStackPointer64(), GetStackPointer64(), size);
+  // Make sure the real stack pointer reflects the claimed stack space.
+  // We can't use stack memory below the stack pointer, it could be clobbered by
+  // interupts and signal handlers.
+  if (!sp.Is(GetStackPointer64()))
+    Mov(sp, GetStackPointer64());
 }
 
 
 void MacroAssembler::Drop(const Operand& size) {
 
   if (size.IsZero()) {
     return;
   }