#define CFRAME_OFS_PC (6*4)
#define CFRAME_OFS_MULTRES (5*4)
#define CFRAME_SIZE (12*4)
+#define CFRAME_SIZE_JIT CFRAME_SIZE
#elif LJ_TARGET_X64
#if _WIN64
#define CFRAME_OFS_PREV (13*8)
#define CFRAME_OFS_NRES (22*4)
#define CFRAME_OFS_MULTRES (21*4)
#define CFRAME_SIZE (10*8)
+#define CFRAME_SIZE_JIT (CFRAME_SIZE + 9*16 + 4*8)
#else
#define CFRAME_OFS_PREV (4*8)
#define CFRAME_OFS_PC (7*4)
#define CFRAME_OFS_NRES (4*4)
#define CFRAME_OFS_MULTRES (1*4)
#define CFRAME_SIZE (10*8)
+#define CFRAME_SIZE_JIT (CFRAME_SIZE + 16)
#endif
#else
#error "Missing CFRAME_* definitions for this architecture"
DB(DW_CFA_offset|DW_REG_SI); DUV(4);
DB(DW_CFA_offset|DW_REG_BX); DUV(5);
#elif LJ_TARGET_X64
- /* Add saved registers for x64 CFRAME. */
+ DB(DW_CFA_offset|DW_REG_BP); DUV(2);
+ DB(DW_CFA_offset|DW_REG_BX); DUV(3);
+ DB(DW_CFA_offset|DW_REG_15); DUV(4);
+ DB(DW_CFA_offset|DW_REG_14); DUV(5);
+ /* Extra registers saved for JIT-compiled code. */
+ DB(DW_CFA_offset|DW_REG_13); DUV(9);
+ DB(DW_CFA_offset|DW_REG_12); DUV(10);
#else
#error "Unsupported target architecture"
#endif
ctx.T = T;
ctx.mcaddr = (uintptr_t)T->mcode;
ctx.szmcode = T->szmcode;
- ctx.spadjp = CFRAME_SIZE + (MSize)(parent ? J->trace[parent]->spadjust : 0);
- ctx.spadj = CFRAME_SIZE + T->spadjust;
+ ctx.spadjp = CFRAME_SIZE_JIT + (MSize)(parent?J->trace[parent]->spadjust:0);
+ ctx.spadj = CFRAME_SIZE_JIT + T->spadjust;
ctx.lineno = proto_line(pt, proto_bcpos(pt, startpc));
ctx.filename = strdata(proto_chunkname(pt));
if (*ctx.filename == '@' || *ctx.filename == '=')