Remove InfoVars, reassign DAT from EBP to ESI to preserve C++ stacktraces in JIT code (bug 5844 part 10, r=ds).

This commit is contained in:
David Anderson 2013-08-12 00:24:02 +01:00
parent 04129a0841
commit b39fcebe65
2 changed files with 18 additions and 34 deletions

View File

@ -208,7 +208,7 @@ PushTracker(sp_context_t *ctx, size_t amount)
} }
static int static int
GenerateArray(BaseRuntime *rt, InfoVars &vars, uint32_t argc, cell_t *argv, int autozero) GenerateArray(BaseRuntime *rt, uint32_t argc, cell_t *argv, int autozero)
{ {
sp_context_t *ctx = rt->GetBaseContext()->GetCtx(); sp_context_t *ctx = rt->GetBaseContext()->GetCtx();
@ -1442,10 +1442,9 @@ Compiler::emitGenArray(bool autozero)
__ push(autozero ? 1 : 0); __ push(autozero ? 1 : 0);
__ push(stk); __ push(stk);
__ push(val); __ push(val);
__ push(info);
__ push(intptr_t(rt_)); __ push(intptr_t(rt_));
__ call(ExternalAddress((void *)GenerateArray)); __ call(ExternalAddress((void *)GenerateArray));
__ addl(esp, 5 * sizeof(void *)); __ addl(esp, 4 * sizeof(void *));
// restore pri to tmp // restore pri to tmp
__ pop(tmp); __ pop(tmp);
@ -1753,34 +1752,30 @@ Compiler::emitErrorPaths()
} }
} }
typedef int (*JIT_EXECUTE)(InfoVars *vars, void *addr, uint8_t *memory, sp_context_t *ctx); typedef int (*JIT_EXECUTE)(sp_context_t *ctx, uint8_t *memory, void *code);
static void * static void *
GenerateEntry(void **retp) GenerateEntry(void **retp)
{ {
AssemblerX86 masm; AssemblerX86 masm;
// Variables we're passed in:
// InfoVars *vars, void *entry, uint8_t *memory, sp_context_t *
__ push(ebp); __ push(ebp);
__ movl(ebp, esp); __ movl(ebp, esp);
__ push(esi); __ push(esi); // ebp - 4
__ push(edi); __ push(edi); // ebp - 8
__ push(ebx); __ push(ebx); // ebp - 12
__ push(esp); // ebp - 16
__ movl(esi, Operand(ebp, 8 + 4 * 0)); __ movl(ebx, Operand(ebp, 8 + 4 * 0));
__ movl(ecx, Operand(ebp, 8 + 4 * 1)); __ movl(eax, Operand(ebp, 8 + 4 * 1));
__ movl(eax, Operand(ebp, 8 + 4 * 2)); __ movl(ecx, Operand(ebp, 8 + 4 * 2));
// Set up run-time registers. // Set up run-time registers.
__ movl(ebx, Operand(ebp, 8 + 4 * 3));
__ movl(edi, Operand(ebx, offsetof(sp_context_t, sp))); __ movl(edi, Operand(ebx, offsetof(sp_context_t, sp)));
__ addl(edi, eax); __ addl(edi, eax);
__ movl(ebp, eax); __ movl(esi, eax);
__ movl(ebx, edi); __ movl(ebx, edi);
__ movl(Operand(esi, AMX_INFO_NSTACK), esp);
// Align the stack. // Align the stack.
__ andl(esp, 0xfffffff0); __ andl(esp, 0xfffffff0);
@ -1788,11 +1783,8 @@ GenerateEntry(void **retp)
// Call into plugin (align the stack first). // Call into plugin (align the stack first).
__ call(ecx); __ call(ecx);
// Restore stack.
__ movl(esp, Operand(info, AMX_INFO_NSTACK));
// Get input context, store rval. // Get input context, store rval.
__ movl(ecx, Operand(esp, 32)); __ movl(ecx, Operand(ebp, 8 + 4 * 0));
__ movl(Operand(ecx, offsetof(sp_context_t, rval)), pri); __ movl(Operand(ecx, offsetof(sp_context_t, rval)), pri);
// Set no error. // Set no error.
@ -1805,6 +1797,9 @@ GenerateEntry(void **retp)
__ subl(stk, dat); __ subl(stk, dat);
__ movl(Operand(ecx, offsetof(sp_context_t, sp)), stk); __ movl(Operand(ecx, offsetof(sp_context_t, sp)), stk);
// Restore stack.
__ movl(esp, Operand(ebp, -16));
// Restore registers and gtfo. // Restore registers and gtfo.
__ pop(ebx); __ pop(ebx);
__ pop(edi); __ pop(edi);
@ -1815,8 +1810,7 @@ GenerateEntry(void **retp)
// The universal emergency return will jump to here. // The universal emergency return will jump to here.
Label error; Label error;
__ bind(&error); __ bind(&error);
__ movl(esp, Operand(info, AMX_INFO_NSTACK)); __ movl(ecx, Operand(ebp, 8 + 4 * 0)); // ret-path expects ecx = ctx
__ movl(ecx, Operand(esp, 32)); // ret-path expects ecx = ctx
__ jmp(&ret); __ jmp(&ret);
void *code = LinkCode(masm); void *code = LinkCode(masm);
@ -1975,11 +1969,8 @@ int JITX86::InvokeFunction(BaseRuntime *runtime, JitFunction *fn, cell_t *result
// Note that cip, hp, sp are saved and restored by Execute2(). // Note that cip, hp, sp are saved and restored by Execute2().
ctx->cip = fn->GetPCodeAddress(); ctx->cip = fn->GetPCodeAddress();
InfoVars vars;
/* vars.esp will be set in the entry code */
JIT_EXECUTE pfn = (JIT_EXECUTE)m_pJitEntry; JIT_EXECUTE pfn = (JIT_EXECUTE)m_pJitEntry;
int err = pfn(&vars, fn->GetEntryAddress(), runtime->plugin()->memory, ctx); int err = pfn(ctx, runtime->plugin()->memory, fn->GetEntryAddress());
*result = ctx->rval; *result = ctx->rval;
return err; return err;

View File

@ -203,17 +203,10 @@ class JITX86
const Register pri = eax; const Register pri = eax;
const Register alt = edx; const Register alt = edx;
const Register stk = edi; const Register stk = edi;
const Register dat = ebp; const Register dat = esi;
const Register tmp = ecx; const Register tmp = ecx;
const Register info = esi;
const Register frm = ebx; const Register frm = ebx;
struct InfoVars {
void *esp;
};
#define AMX_INFO_NSTACK offsetof(InfoVars, esp)
extern Knight::KeCodeCache *g_pCodeCache; extern Knight::KeCodeCache *g_pCodeCache;
extern JITX86 g_Jit; extern JITX86 g_Jit;