File 0144-fix-output-formatting-in-several-HiPE-debug-BIFs.patch of Package erlang

From d71c5604e7ba5e30391c493fb46e67a0284cef76 Mon Sep 17 00:00:00 2001
From: Mikael Pettersson <mikpelinux@gmail.com>
Date: Sat, 11 Nov 2017 14:29:16 +0100
Subject: [PATCH] fix output formatting in several HiPE debug BIFs

Fix formatting in hipe_bifs:show_pcb/1, hipe_bifs:show_estack/1,
and hipe_bifs:show_nstack/1.

fflush(stdout) before switching from printf() to erts_printf() to
avoid garbled output.

Adjust field lengths to work on both 64- and 32-bit systems.

Tested on Linux/x86_64 (64-bit) and Linux/ARMv7 (32-bit).
---
 erts/emulator/hipe/hipe_debug.c      | 24 +++++++++++++++++-------
 erts/emulator/hipe/hipe_risc_stack.c |  8 ++++++--
 erts/emulator/hipe/hipe_x86_stack.c  |  8 ++++++--
 3 files changed, 29 insertions(+), 11 deletions(-)

diff --git a/erts/emulator/hipe/hipe_debug.c b/erts/emulator/hipe/hipe_debug.c
index cfe60b379e..929b2a9432 100644
--- a/erts/emulator/hipe/hipe_debug.c
+++ b/erts/emulator/hipe/hipe_debug.c
@@ -63,10 +63,11 @@ static void print_beam_pc(BeamInstr *pc)
 	printf("normal-process-exit");
     } else {
 	BeamInstr *mfa = find_function_from_pc(pc);
-	if (mfa)
+	if (mfa) {
+	    fflush(stdout);
 	    erts_printf("%T:%T/%bpu + 0x%bpx",
 			mfa[0], mfa[1], mfa[2], pc - &mfa[3]);
-	else
+	} else
 	    printf("?");
     }
 }
@@ -116,6 +117,7 @@ static void print_stack(Eterm *sp, Eterm *end)
 	    printf(" | 0x%0*lx | 0x%0*lx | ",
 		   2*(int)sizeof(long), (unsigned long)sp,
 		   2*(int)sizeof(long), (unsigned long)val);
+	    fflush(stdout);
 	    erts_printf("%.30T", val);
 	    printf("\r\n");
 	}
@@ -126,7 +128,9 @@ static void print_stack(Eterm *sp, Eterm *end)
 
 void hipe_print_estack(Process *p)
 {
-    printf(" |       BEAM  STACK       |\r\n");
+    printf(" | %*s BEAM   STACK %*s |\r\n",
+	   2*(int)sizeof(long)-3, "",
+	   2*(int)sizeof(long)-4, "");
     print_stack(p->stop, STACK_START(p));
 }
 
@@ -177,11 +181,15 @@ void hipe_print_heap(Process *p)
 void hipe_print_pcb(Process *p)
 {
     printf("P: 0x%0*lx\r\n", 2*(int)sizeof(long), (unsigned long)p);
-    printf("-----------------------------------------------\r\n");
-    printf("Offset| Name        | Value      | *Value     |\r\n");
+    printf("%.*s\r\n",
+           6+1+13+1+2*(int)sizeof(long)+4+1+2*(int)sizeof(long)+4+1,
+           "---------------------------------------------------------------");
+    printf("Offset| Name        | Value %*s | *Value %*s |\r\n",
+           2*(int)sizeof(long)-4, "",
+           2*(int)sizeof(long)-5, "");
 #undef U
 #define U(n,x) \
-    printf(" % 4d | %s | 0x%0*lx |            |\r\n", (int)offsetof(Process,x), n, 2*(int)sizeof(long), (unsigned long)p->x)
+    printf(" % 4d | %s | 0x%0*lx | %*s |\r\n", (int)offsetof(Process,x), n, 2*(int)sizeof(long), (unsigned long)p->x, 2*(int)sizeof(long)+2, "")
 #undef P
 #define P(n,x) \
     printf(" % 4d | %s | 0x%0*lx | 0x%0*lx |\r\n", (int)offsetof(Process,x), n, 2*(int)sizeof(long), (unsigned long)p->x, 2*(int)sizeof(long), p->x ? (unsigned long)*(p->x) : -1UL)
@@ -245,5 +253,7 @@ void hipe_print_pcb(Process *p)
 #endif	/* HIPE */
 #undef U
 #undef P
-    printf("-----------------------------------------------\r\n");
+    printf("%.*s\r\n",
+           6+1+14+1+2*(int)sizeof(long)+4+1+2*(int)sizeof(long)+4+1,
+           "---------------------------------------------------------------");
 }
diff --git a/erts/emulator/hipe/hipe_risc_stack.c b/erts/emulator/hipe/hipe_risc_stack.c
index 4001bedeb6..bb93a918a2 100644
--- a/erts/emulator/hipe/hipe_risc_stack.c
+++ b/erts/emulator/hipe/hipe_risc_stack.c
@@ -47,8 +47,10 @@ static void print_slot(Eterm *sp, unsigned int live)
     printf(" | 0x%0*lx | 0x%0*lx | ",
 	   2*(int)sizeof(long), (unsigned long)sp,
 	   2*(int)sizeof(long), val);
-    if (live)
+    if (live) {
+	fflush(stdout);
 	erts_printf("%.30T", val);
+    }
     printf("\r\n");
 }
 
@@ -68,7 +70,9 @@ void hipe_print_nstack(Process *p)
 	[0 ... 2*sizeof(long)+3] = '-'
     };
 
-    printf(" |      NATIVE  STACK      |\r\n");
+    printf(" | %*s NATIVE   STACK %*s |\r\n",
+	   2*(int)sizeof(long)-5, "",
+	   2*(int)sizeof(long)-4, "");
     printf(" |%s|%s|\r\n", dashes, dashes);
     printf(" | %*s | 0x%0*lx |\r\n",
 	   2+2*(int)sizeof(long), "heap",
diff --git a/erts/emulator/hipe/hipe_x86_stack.c b/erts/emulator/hipe/hipe_x86_stack.c
index 31582b3a2e..615e07917a 100644
--- a/erts/emulator/hipe/hipe_x86_stack.c
+++ b/erts/emulator/hipe/hipe_x86_stack.c
@@ -43,8 +43,10 @@ static void print_slot(Eterm *sp, unsigned int live)
     printf(" | 0x%0*lx | 0x%0*lx | ",
 	   2*(int)sizeof(long), (unsigned long)sp,
 	   2*(int)sizeof(long), val);
-    if (live)
+    if (live) {
+	fflush(stdout);
 	erts_printf("%.30T", val);
+    }
     printf("\r\n");
 }
 
@@ -74,7 +76,9 @@ void hipe_print_nstack(Process *p)
     sdesc0.livebits[0] = ~1;
     sdesc = &sdesc0;
 
-    printf(" |      NATIVE  STACK      |\r\n");
+    printf(" | %*s NATIVE   STACK %*s |\r\n",
+	   2*(int)sizeof(long)-5, "",
+	   2*(int)sizeof(long)-4, "");
     printf(" |%s|%s|\r\n", dashes, dashes);
     printf(" | %*s | 0x%0*lx |\r\n",
 	   2+2*(int)sizeof(long), "heap",
-- 
2.15.1

openSUSE Build Service is sponsored by