]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
Add frame info for x64 GDB JIT API.
authorMike Pall <mike>
Sun, 28 Feb 2010 16:52:11 +0000 (17:52 +0100)
committerMike Pall <mike>
Sun, 28 Feb 2010 16:52:11 +0000 (17:52 +0100)
src/lj_frame.h
src/lj_gdbjit.c

index 089b24f6ee160c6e7708e4e0fa9ef6b36325aad8..549784c63357d124e6ccd01add82d561215ed0a2 100644 (file)
@@ -66,6 +66,7 @@ enum {
 #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)
@@ -75,6 +76,7 @@ enum {
 #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)
@@ -83,6 +85,7 @@ enum {
 #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"
index f71b308195e97b1d6bde219d4af619a75996158a..c6e348074c4c46604bf0379be463769ffda7cecc 100644 (file)
@@ -528,7 +528,13 @@ static void LJ_FASTCALL gdbjit_ehframe(GDBJITctx *ctx)
     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
@@ -703,8 +709,8 @@ void lj_gdbjit_addtrace(jit_State *J, Trace *T, TraceNo traceno)
   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 == '=')