File 0369-jit-Check-pending-stubs-in-i_bs_create_bin.patch of Package erlang

From 09605ff543481f1df004993b9b1afd3808bff85b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?John=20H=C3=B6gberg?= <john@erlang.org>
Date: Mon, 16 Sep 2024 14:24:55 +0200
Subject: [PATCH] jit: Check pending stubs in i_bs_create_bin

---
 erts/emulator/beam/jit/arm/instr_bs.cpp   |   4 +
 erts/emulator/test/bs_construct_SUITE.erl | 271 +++++++++++++++++++++-
 2 files changed, 272 insertions(+), 3 deletions(-)

diff --git a/erts/emulator/beam/jit/arm/instr_bs.cpp b/erts/emulator/beam/jit/arm/instr_bs.cpp
index 0bdaad1744..a1814fc94c 100644
--- a/erts/emulator/beam/jit/arm/instr_bs.cpp
+++ b/erts/emulator/beam/jit/arm/instr_bs.cpp
@@ -2598,6 +2598,8 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail,
                 break;
             }
         }
+
+        check_pending_stubs();
     }
 
     /* Allocate the binary. */
@@ -3243,6 +3245,8 @@ void BeamModuleAssembler::emit_i_bs_create_bin(const ArgLabel &Fail,
         } else if (std::gcd(seg.unit, 8) != 8) {
             is_byte_aligned = false;
         }
+
+        check_pending_stubs();
     }
 
     comment("done");
diff --git a/erts/emulator/test/bs_construct_SUITE.erl b/erts/emulator/test/bs_construct_SUITE.erl
index 9a8da0bafc..9c110b9dd0 100644
--- a/erts/emulator/test/bs_construct_SUITE.erl
+++ b/erts/emulator/test/bs_construct_SUITE.erl
@@ -31,8 +31,8 @@
          bs_append_offheap/1,
          reductions/1, fp16/1, zero_init/1, error_info/1, little/1,
          heap_binary_unit/1,
-         otp_24_code_gh_8238/1
-        ]).
+         otp_24_code_gh_8238/1,
+         many_segments/1]).
 
 -include_lib("common_test/include/ct.hrl").
 
@@ -48,7 +48,8 @@ all() ->
      bad_append, bs_append_overflow, bs_append_offheap,
      reductions, fp16, zero_init,
      error_info, little, heap_binary_unit,
-     otp_24_code_gh_8238].
+     otp_24_code_gh_8238,
+     many_segments].
 
 init_per_suite(Config) ->
     Config.
@@ -1730,6 +1731,270 @@ otp_24_code_gh_8238(Config) ->
             {skip,"Enough to run once"}
     end.
 
+%% GH-8815: Binary construction with "too many" segments failed to JIT on ARM.
+many_segments(_Config) ->
+    Val = id(<<"fhqwhgads">>),
+    id(<<"COL_A,COL_B\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n", Val/binary, ",B0\n",
+         Val/binary, ",B0\n">>),
+    ok.
+
 %%%
 %%% Common utilities.
 %%%
-- 
2.43.0

openSUSE Build Service is sponsored by