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