From b9d60d299a56a3bead2d937dc74eb02c233d0b5c Mon Sep 17 00:00:00 2001 From: Steven Johnson Date: Tue, 12 Jan 2010 13:49:50 -0800 Subject: [PATCH] nanojit/NativePPC.cpp: PPC backend needs to ensure caller parameter area is at least 8 registers in size (r=rreitmai,r=nnethercote,bug=539270) --HG-- extra : convert_revision : 8cc0cbcb83e2ac84078705b23a5232a6d8518a6c --- js/src/nanojit/NativePPC.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/js/src/nanojit/NativePPC.cpp b/js/src/nanojit/NativePPC.cpp index d557adf7378f..5b44722569ec 100644 --- a/js/src/nanojit/NativePPC.cpp +++ b/js/src/nanojit/NativePPC.cpp @@ -87,6 +87,7 @@ namespace nanojit * sp+12 sp+24 reserved */ + const int min_param_area_size = 8*sizeof(void*); // r3-r10 const int linkage_size = 6*sizeof(void*); const int lr_offset = 2*sizeof(void*); // linkage.lr const int cr_offset = 1*sizeof(void*); // linkage.cr @@ -96,8 +97,13 @@ namespace nanojit // stw r0, lr_offset(sp) // stwu sp, -framesize(sp) + // param_area must be at least large enough for r3-r10 to be saved, + // regardless of whether we think the callee needs less: e.g., the callee + // might tail-call to a function that uses varargs, which could flush + // r3-r10 to the parameter area. + uint32_t param_area = (max_param_size > min_param_area_size) ? max_param_size : min_param_area_size; // activation frame is 4 bytes per entry even on 64bit machines - uint32_t stackNeeded = max_param_size + linkage_size + _activation.stackSlotsNeeded() * 4; + uint32_t stackNeeded = param_area + linkage_size + _activation.stackSlotsNeeded() * 4; uint32_t aligned = alignUp(stackNeeded, NJ_ALIGN_STACK); UNLESS_PEDANTIC( if (isS16(aligned)) {