File 0012-Fix-debug-information-for-PPC64.patch of Package lua51-luajit

From 76d561731a88cde95f171e01820c7af9edc62ead Mon Sep 17 00:00:00 2001
From: Gustavo Serra Scalet <gustavo.scalet@eldorado.org.br>
Date: Tue, 29 Aug 2017 17:45:47 -0300
Subject: [PATCH 12/15] Fix debug information for PPC64

Removed the complicated handling of lj_vm_ffi_call (it was a variable
size frame) and now backtrace works all over (e.g:)

 #0  0x00003fffb7d4875c in __libc_send (fd=32, buf=0x3fffb09a0028, len=8192, flags=0) at ../sysdeps/unix/sysv/linux/send.c:31
 #1  0x00003fffb7bea214 in socket_send (ps=0x3fffb7bc7778, data=0x3fffb09a0028 'A' <repeats 200 times>..., count=8192, sent=0x3fffffffee60, tm=0x3fffb7bc97d8) at usocket.c:205
 #2  0x00003fffb7be4ef8 in sendraw (buf=0x3fffb7bc77a0, data=0x3fffb09a0028 'A' <repeats 200 times>..., count=52428800, sent=0x3fffffffeee8) at buffer.c:176
 #3  0x00003fffb7be4960 in buffer_meth_send (L=0x3fffb7f6d280, buf=0x3fffb7bc77a0) at buffer.c:87
 #4  0x00003fffb7bec3f4 in meth_send (L=0x3fffb7f6d280) at tcp.c:130
 #5  0x0000000010042d44 in lj_BC_FUNCC ()
 #6  0x0000000010043f24 in lj_ff_coroutine_resume ()
 #7  0x000000001001d7d4 in lua_pcall (L=0x3fffb7f60378, nargs=0, nresults=-1, errfunc=2) at lj_api.c:1129
 #8  0x00000000100045e8 in docall (L=0x3fffb7f60378, narg=0, clear=0) at luajit.c:121
 #9  0x00000000100053ec in handle_script (L=0x3fffb7f60378, argx=0x3ffffffffa40) at luajit.c:291
 #10 0x0000000010006600 in pmain (L=0x3fffb7f60378) at luajit.c:551
 #11 0x0000000010042d44 in lj_BC_FUNCC ()
 #12 0x000000001001da40 in lua_cpcall (L=0x3fffb7f60378, func=0x10006334 <pmain>, ud=0x0) at lj_api.c:1153
 #13 0x00000000100067a4 in main (argc=2, argv=0x3ffffffffa38) at luajit.c:580
---
 src/vm_ppc64.dasc | 118 +++++++---------------------------------------
 1 file changed, 17 insertions(+), 101 deletions(-)

diff --git a/src/vm_ppc64.dasc b/src/vm_ppc64.dasc
index d7e6bb6ab530..5d15d01ac820 100644
--- a/src/vm_ppc64.dasc
+++ b/src/vm_ppc64.dasc
@@ -2360,17 +2360,15 @@ static void build_subroutines(BuildCtx *ctx)
   |  // Caveat: needs special frame unwinding, see below.
   |.if FFI
   |  .type CCSTATE, CCallState, CARG1
-  |  lwz TMP1, CCSTATE->spadj
   |    mflr TMP0
   |   lbz CARG2, CCSTATE->nsp
   |   lbz CARG3, CCSTATE->nfpr
-  |  neg TMP1, TMP1
   |    std TMP0, 16(sp)
   |   cmpdi cr1, CARG3, 0
   |   std TOCREG, 24(sp)
   |  mr TMP2, sp
   |   addic. CARG2, CARG2, -1
-  |  stdux sp, sp, TMP1
+  |  stdu sp, -CFRAME_SPACE(sp)
   |   crnot 4*cr1+eq, 4*cr1+eq		// For vararg calls.
   |  std r14, -8(TMP2)
   |  std CCSTATE, -16(TMP2)
@@ -4381,8 +4379,7 @@ static int build_backend(BuildCtx *ctx)
 /* Emit pseudo frame-info for all assembler functions. */
 static void emit_asm_debug(BuildCtx *ctx)
 {
-  int fcofs = (int)((uint8_t *)ctx->glob[GLOB_vm_ffi_call] - ctx->code);
-  int i, lr_offset = -16 >> 2;
+  int i;
   switch (ctx->mode) {
   case BUILD_elfasm:
     fprintf(ctx->fp, "\t.section .debug_frame,\"\",@progbits\n");
@@ -4394,11 +4391,12 @@ static void emit_asm_debug(BuildCtx *ctx)
 	"\t.byte 0x1\n"			/* Version */
 	"\t.string \"\"\n"		/* augmentation */
 	"\t.uleb128 0x1\n"		/* code_alignment_factor */
-	"\t.sleb128 -4\n"		/* data_alignment_factor */
+	"\t.sleb128 -8\n"		/* data_alignment_factor */
 	"\t.byte 65\n"			/* return_address_register (LR) */
-	"\t.byte 0xc\n\t.uleb128 1\n\t.uleb128 0\n"	/* DW_CFA_def_cfa */
+	"\t.byte 0xc\n\t.uleb128 1\n\t.uleb128 %d\n"	/* DW_CFA_def_cfa */
 	"\t.align 2\n"
-	".LECIE0:\n\n");
+	".LECIE0:\n\n",
+        CFRAME_SIZE);
     fprintf(ctx->fp,
 	".LSFDE0:\n"			/* Frame Description Entry (FDE) */
 	"\t.long .LEFDE0-.LASFDE0\n"	/* length */
@@ -4407,11 +4405,17 @@ static void emit_asm_debug(BuildCtx *ctx)
 	"\t.long .Lbegin\n"		/* initial_location */
 	"\t.long %d\n"			/* address_range */
 	"\t.byte 0xe\n\t.uleb128 %d\n"	/* DW_CFA_def_cfa_offset */
-	/* DW_CFA_offset_extended_sf */
-	"\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 %d\n"
-	/* DW_CFA_offset_extended */
-	"\t.byte 0x5\n\t.uleb128 70\n\t.uleb128 55\n",
-	fcofs, CFRAME_SIZE, lr_offset);
+	/* DW_CFA_offset_extended_sf (TOC) */
+	"\t.byte 0x11\n\t.uleb128 2\n\t.sleb128 %d\n"
+
+        /* DW_CFA_val_expression of size 9 for LR register */
+	"\t.byte 0x16\n\t.uleb128 65\n\t.uleb128 9\n"
+	"\t.byte 0x70\n\t.uleb128 1\n\t.sleb128 0\n"    /* DW_OP_breg */
+	"\t.byte 0x06\n"                /* DW_OP_deref */
+	"\t.byte 0x11\n\t.sleb128 16\n" /* DW_OP_consts */
+	"\t.byte 0x22\n"                /* DW_OP_plus */
+	"\t.byte 0x06\n",               /* DW_OP_deref */
+	(int)ctx->codesz, CFRAME_SIZE, 24 / -8);
     for (i = 14; i <= 31; i++)
       fprintf(ctx->fp,
 	"\t.byte %d\n\t.uleb128 %d\n"	/* DW_CFA_offset from r14 to r31 */
@@ -4420,94 +4424,6 @@ static void emit_asm_debug(BuildCtx *ctx)
     fprintf(ctx->fp,
 	"\t.align 2\n"
 	".LEFDE0:\n\n");
-#if LJ_HASFFI
-    fprintf(ctx->fp,
-	".LSFDE1:\n"			/* Frame Description Entry (FDE) */
-	"\t.long .LEFDE1-.LASFDE1\n"	/* length */
-	".LASFDE1:\n"
-	"\t.long .Lframe0\n"		/* CIE_ptr */
-	"\t.long lj_vm_ffi_call\n"	/* initial_location */
-	"\t.long %d\n"			/* address_range */
-	/* DW_CFA_offset_extended_sf */
-	"\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 %d\n"
-	"\t.byte 0x8e\n\t.uleb128 2\n"	/* DW_CFA_offset */
-	"\t.byte 0xd\n\t.uleb128 0xe\n"	/* DW_CFA_def_cfa_register */
-	"\t.align 2\n"
-	".LEFDE1:\n\n", (int)ctx->codesz - fcofs, lr_offset);
-#endif
-#if !LJ_NO_UNWIND
-    fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@progbits\n");
-    fprintf(ctx->fp,
-	".Lframe1:\n"
-	"\t.long .LECIE1-.LSCIE1\n"	/* length */
-	".LSCIE1:\n"			/* Common Information Entry (CIE) */
-	"\t.long 0\n"			/* CIE_Id */
-	"\t.byte 0x1\n"			/* Version */
-	"\t.string \"zPR\"\n"		/* augmentation string */
-	"\t.uleb128 0x1\n"		/* code_alignment_factor */
-	"\t.sleb128 -4\n"		/* data_alignment_factor */
-	"\t.byte 65\n"			/* return_address_register (LR) */
-	"\t.uleb128 6\n"			/* augmentation length */
-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */
-	"\t.long lj_err_unwind_dwarf-.\n"
-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */
-	"\t.byte 0xc\n\t.uleb128 1\n\t.uleb128 0\n"	/* DW_CFA_def_cfa */
-	"\t.align 2\n"
-	".LECIE1:\n\n");
-    fprintf(ctx->fp,
-	".LSFDE2:\n"
-	"\t.long .LEFDE2-.LASFDE2\n"
-	".LASFDE2:\n"
-	"\t.long .LASFDE2-.Lframe1\n"
-	"\t.long .Lbegin-.\n"
-	"\t.long %d\n"
-	"\t.uleb128 0\n"			/* augmentation length */
-	"\t.byte 0xe\n\t.uleb128 %d\n"		/* DW_CFA_def_cfa_offset */
-	/* DW_CFA_offset_extended_sf */
-	"\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 %d\n"
-	/* DW_CFA_offset_extended */
-	"\t.byte 0x5\n\t.uleb128 70\n\t.uleb128 55\n",
-	fcofs, CFRAME_SIZE, lr_offset);
-    for (i = 14; i <= 31; i++)
-      fprintf(ctx->fp,
-	"\t.byte %d\n\t.uleb128 %d\n"	/* DW_CFA_offset from r14 to r31 */
-	"\t.byte %d\n\t.uleb128 %d\n",	/* DW_CFA_offset from f14 to f31 */
-	0x80+i, 38+2*(31-i), 0x80+32+i, 2+2*(31-i));
-    fprintf(ctx->fp,
-	"\t.align 2\n"
-	".LEFDE2:\n\n");
-#if LJ_HASFFI
-    fprintf(ctx->fp,
-	".Lframe2:\n"
-	"\t.long .LECIE2-.LSCIE2\n"
-	".LSCIE2:\n"			/* Common Information Entry (CIE) */
-	"\t.long 0\n"			/* CIE_Id */
-	"\t.byte 0x1\n"			/* Version */
-	"\t.string \"zR\"\n"		/* augmentation string */
-	"\t.uleb128 0x1\n"		/* code_alignment_factor */
-	"\t.sleb128 -4\n"		/* data_alignment_factor */
-	"\t.byte 65\n"			/* return_address_register (LR) */
-	"\t.uleb128 1\n"			/* augmentation length */
-	"\t.byte 0x1b\n"			/* pcrel|sdata4 */
-	"\t.byte 0xc\n\t.uleb128 1\n\t.uleb128 0\n"	/* DW_CFA_def_cfa */
-	"\t.align 2\n"
-	".LECIE2:\n\n");
-    fprintf(ctx->fp,
-	".LSFDE3:\n"
-	"\t.long .LEFDE3-.LASFDE3\n"
-	".LASFDE3:\n"
-	"\t.long .LASFDE3-.Lframe2\n"
-	"\t.long lj_vm_ffi_call-.\n"
-	"\t.long %d\n"
-	"\t.uleb128 0\n"			/* augmentation length */
-	/* DW_CFA_offset_extended_sf */
-	"\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 %d\n"
-	"\t.byte 0x8e\n\t.uleb128 2\n"	/* DW_CFA_offset */
-	"\t.byte 0xd\n\t.uleb128 0xe\n"	/* DW_CFA_def_cfa_register */
-	"\t.align 2\n"
-	".LEFDE3:\n\n", (int)ctx->codesz - fcofs, lr_offset);
-#endif
-#endif
     break;
   default:
     break;
-- 
2.20.1