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.
--- 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;
}