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
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();
@ -1442,10 +1442,9 @@ Compiler::emitGenArray(bool autozero)
__ push(autozero ? 1 : 0);
__ push(stk);
__ push(val);
__ push(info);
__ push(intptr_t(rt_));
__ call(ExternalAddress((void *)GenerateArray));
__ addl(esp, 5 * sizeof(void *));
__ addl(esp, 4 * sizeof(void *));
// restore pri to 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 *
GenerateEntry(void **retp)
{
AssemblerX86 masm;
// Variables we're passed in:
// InfoVars *vars, void *entry, uint8_t *memory, sp_context_t *
__ push(ebp);
__ movl(ebp, esp);
__ push(esi);
__ push(edi);
__ push(ebx);
__ push(esi); // ebp - 4
__ push(edi); // ebp - 8
__ push(ebx); // ebp - 12
__ push(esp); // ebp - 16
__ movl(esi, Operand(ebp, 8 + 4 * 0));
__ movl(ecx, Operand(ebp, 8 + 4 * 1));
__ movl(eax, Operand(ebp, 8 + 4 * 2));
__ movl(ebx, Operand(ebp, 8 + 4 * 0));
__ movl(eax, Operand(ebp, 8 + 4 * 1));
__ movl(ecx, Operand(ebp, 8 + 4 * 2));
// Set up run-time registers.
__ movl(ebx, Operand(ebp, 8 + 4 * 3));
__ movl(edi, Operand(ebx, offsetof(sp_context_t, sp)));
__ addl(edi, eax);
__ movl(ebp, eax);
__ movl(esi, eax);
__ movl(ebx, edi);
__ movl(Operand(esi, AMX_INFO_NSTACK), esp);
// Align the stack.
__ andl(esp, 0xfffffff0);
@ -1788,11 +1783,8 @@ GenerateEntry(void **retp)
// Call into plugin (align the stack first).
__ call(ecx);
// Restore stack.
__ movl(esp, Operand(info, AMX_INFO_NSTACK));
// 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);
// Set no error.
@ -1805,6 +1797,9 @@ GenerateEntry(void **retp)
__ subl(stk, dat);
__ movl(Operand(ecx, offsetof(sp_context_t, sp)), stk);
// Restore stack.
__ movl(esp, Operand(ebp, -16));
// Restore registers and gtfo.
__ pop(ebx);
__ pop(edi);
@ -1815,8 +1810,7 @@ GenerateEntry(void **retp)
// The universal emergency return will jump to here.
Label error;
__ bind(&error);
__ movl(esp, Operand(info, AMX_INFO_NSTACK));
__ movl(ecx, Operand(esp, 32)); // ret-path expects ecx = ctx
__ movl(ecx, Operand(ebp, 8 + 4 * 0)); // ret-path expects ecx = ctx
__ jmp(&ret);
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().
ctx->cip = fn->GetPCodeAddress();
InfoVars vars;
/* vars.esp will be set in the entry code */
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;
return err;

View File

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