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