File 0313-crash-dump-Include-correct-IP-for-a-garbing-process.patch of Package erlang

From f8d1787cd7accb1e6aabeec43bb7eaec66467852 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Fri, 12 Apr 2019 12:58:31 +0200
Subject: [PATCH 10/11] crash dump: Include correct IP for a garbing process

Make sure that the instruction pointer is correct for a garbing
process in a crash dump.
---
 erts/emulator/beam/bs_instrs.tab |  2 +-
 erts/emulator/beam/instrs.tab    |  2 +-
 erts/emulator/beam/macros.tab    | 15 +++++++++++++--
 3 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/erts/emulator/beam/bs_instrs.tab b/erts/emulator/beam/bs_instrs.tab
index 9cad2b03c5..bd1ad91e45 100644
--- a/erts/emulator/beam/bs_instrs.tab
+++ b/erts/emulator/beam/bs_instrs.tab
@@ -125,7 +125,7 @@ BS_GET_UNCHECKED_FIELD_SIZE(Bits, Unit, Fail, Dst) {
 TEST_BIN_VHEAP(VNh, Nh, Live) {
     Uint need = $Nh;
     if (E - HTOP < need || MSO(c_p).overhead + $VNh >= BIN_VHEAP_SZ(c_p)) {
-        SWAPOUT;
+        $GC_SWAPOUT();
         PROCESS_MAIN_CHK_LOCKS(c_p);
         FCALLS -= erts_garbage_collect_nobump(c_p, need, reg, $Live, FCALLS);
         ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
diff --git a/erts/emulator/beam/instrs.tab b/erts/emulator/beam/instrs.tab
index 692408e212..462ee77e6f 100644
--- a/erts/emulator/beam/instrs.tab
+++ b/erts/emulator/beam/instrs.tab
@@ -1001,7 +1001,7 @@ catch_end(Y) {
             }
             /* only x(2) is included in the rootset here */
             if (E - HTOP < 3) {
-                SWAPOUT;
+                $GC_SWAPOUT();
                 PROCESS_MAIN_CHK_LOCKS(c_p);
                 FCALLS -= erts_garbage_collect_nobump(c_p, 3, reg+2, 1, FCALLS);
                 ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
diff --git a/erts/emulator/beam/macros.tab b/erts/emulator/beam/macros.tab
index 494fe8961e..1b5e5f66b0 100644
--- a/erts/emulator/beam/macros.tab
+++ b/erts/emulator/beam/macros.tab
@@ -63,10 +63,21 @@ JUMP(Fail) {
     Goto(*I);
 }
 
+GC_SWAPOUT() {
+    //
+    // Since a garbage collection is expensive anyway, we can afford
+    // to save the instruction counter so that the correct function will
+    // be pointed in the crash dump if the garbage collection fails
+    // because of insufficient memory.
+    //
+    SWAPOUT;
+    c_p->i = I;
+}
+
 GC_TEST(Ns, Nh, Live) {
     Uint need = $Nh + $Ns;
     if (ERTS_UNLIKELY(E - HTOP < need)) {
-       SWAPOUT;
+       $GC_SWAPOUT();
        PROCESS_MAIN_CHK_LOCKS(c_p);
        FCALLS -= erts_garbage_collect_nobump(c_p, need, reg, $Live, FCALLS);
        ERTS_VERIFY_UNUSED_TEMP_ALLOC(c_p);
@@ -79,7 +90,7 @@ GC_TEST(Ns, Nh, Live) {
 GC_TEST_PRESERVE(NeedHeap, Live, PreserveTerm) {
     Uint need = $NeedHeap;
     if (ERTS_UNLIKELY(E - HTOP < need)) {
-       SWAPOUT;
+       $GC_SWAPOUT();
        reg[$Live] = $PreserveTerm;
        PROCESS_MAIN_CHK_LOCKS(c_p);
        FCALLS -= erts_garbage_collect_nobump(c_p, need, reg, $Live+1, FCALLS);
-- 
2.16.4

openSUSE Build Service is sponsored by