File 0191-jit-Update-stack-pointer-in-bs_get_float2.patch of Package erlang

From 13611dee1b112689d9a4242eedf86b6f140b62b1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?John=20H=C3=B6gberg?= <john@erlang.org>
Date: Mon, 9 Jan 2023 15:01:16 +0100
Subject: [PATCH] jit: Update stack pointer in bs_get_float2

---
 erts/emulator/beam/jit/arm/instr_bs.cpp | 11 +++++++++++
 erts/emulator/beam/jit/x86/instr_bs.cpp | 11 +++++++++++
 2 files changed, 22 insertions(+)

diff --git a/erts/emulator/beam/jit/arm/instr_bs.cpp b/erts/emulator/beam/jit/arm/instr_bs.cpp
index 06873cd709..04277534c8 100644
--- a/erts/emulator/beam/jit/arm/instr_bs.cpp
+++ b/erts/emulator/beam/jit/arm/instr_bs.cpp
@@ -919,13 +919,24 @@ void BeamModuleAssembler::emit_i_bs_get_float2(const ArgRegister &Ctx,
     if (emit_bs_get_field_size(Sz, unit, fail, ARG2) >= 0) {
         lea(ARG4, emit_boxed_val(ARG4, offsetof(ErlBinMatchState, mb)));
 
+        /* erts_bs_get_float_2 uses HeapOnlyAlloc which usually requires just
+         * an updated heap pointer, but in debug mode it needs the stack
+         * pointer too for an assertion. */
+#ifdef DEBUG
+        emit_enter_runtime<Update::eStack | Update::eHeap>(Live.get());
+#else
         emit_enter_runtime<Update::eHeap>(Live.get());
+#endif
 
         a.mov(ARG1, c_p);
         mov_imm(ARG3, Flags.get());
         runtime_call<4>(erts_bs_get_float_2);
 
+#ifdef DEBUG
+        emit_leave_runtime<Update::eStack | Update::eHeap>(Live.get());
+#else
         emit_leave_runtime<Update::eHeap>(Live.get());
+#endif
 
         emit_branch_if_not_value(ARG1, fail);
 
diff --git a/erts/emulator/beam/jit/x86/instr_bs.cpp b/erts/emulator/beam/jit/x86/instr_bs.cpp
index ab6abff6cc..2bf909f544 100644
--- a/erts/emulator/beam/jit/x86/instr_bs.cpp
+++ b/erts/emulator/beam/jit/x86/instr_bs.cpp
@@ -1116,14 +1116,25 @@ void BeamModuleAssembler::emit_i_bs_get_float2(const ArgRegister &Ctx,
     emit_gc_test_preserve(ArgWord(FLOAT_SIZE_OBJECT), Live, ARG4);
 
     if (emit_bs_get_field_size(Sz, unit, fail, ARG2, 64) >= 0) {
+        /* erts_bs_get_float_2 uses HeapOnlyAlloc which usually requires just
+         * an updated heap pointer, but in debug mode it needs the stack
+         * pointer too for an assertion. */
+#ifdef DEBUG
+        emit_enter_runtime<Update::eStack | Update::eHeap>();
+#else
         emit_enter_runtime<Update::eHeap>();
+#endif
 
         a.mov(ARG1, c_p);
         mov_imm(ARG3, Flags.get());
         a.lea(ARG4, emit_boxed_val(ARG4, offsetof(ErlBinMatchState, mb)));
         runtime_call<4>(erts_bs_get_float_2);
 
+#ifdef DEBUG
+        emit_leave_runtime<Update::eStack | Update::eHeap>();
+#else
         emit_leave_runtime<Update::eHeap>();
+#endif
 
         emit_test_the_non_value(RET);
         a.je(fail);
-- 
2.35.3

openSUSE Build Service is sponsored by