Fix stack alignment when lazily compiling scripted calls (bug 5871, r=ds).

This commit is contained in:
David Anderson 2013-08-20 23:59:11 -07:00
parent 45856816c1
commit b972ea4781

View File

@ -1550,27 +1550,26 @@ Compiler::emitCallThunks()
// need to patch.
__ movl(eax, Operand(esp, 0));
// Align the stack. Unfortunately this is a pretty careful dance based
// on the number of words we push (4 args, 1 saved esp), and someday
// we should look into automating this.
__ movl(edx, esp);
__ andl(esp, 0xfffffff0);
__ subl(esp, 12);
__ push(edx);
// We need to push 4 arguments, and one of them will need an extra word
// on the stack. Allocate a big block so we're aligned, subtracting
// 4 because we got here via a call.
static const size_t kStackNeeded = 5 * sizeof(void *);
static const size_t kStackReserve = ke::Align(kStackNeeded, 16) - sizeof(void *);
__ subl(esp, kStackReserve);
// Set arguments.
__ movl(Operand(esp, 3 * sizeof(void *)), eax);
__ lea(edx, Operand(esp, 4 * sizeof(void *)));
__ movl(Operand(esp, 2 * sizeof(void *)), edx);
__ movl(Operand(esp, 1 * sizeof(void *)), intptr_t(thunk->pcode_offset));
__ movl(Operand(esp, 0 * sizeof(void *)), intptr_t(rt_));
// Push arguments.
__ push(eax);
__ subl(esp, 4);
__ movl(Operand(esp, 0), esp);
__ push(thunk->pcode_offset);
__ push(intptr_t(rt_));
__ call(ExternalAddress((void *)CompileFromThunk));
__ movl(edx, Operand(esp, 8));
__ movl(esp, Operand(esp, 16));
__ movl(edx, Operand(esp, 4 * sizeof(void *)));
__ addl(esp, kStackReserve);
__ testl(eax, eax);
__ j(not_zero, &error);
__ call(edx);
__ ret();
__ jmp(edx);
__ bind(&error);
__ movl(Operand(cipAddr()), thunk->pcode_offset);