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:
parent
04129a0841
commit
b39fcebe65
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user