File 6551-erts-Quick-and-dirty-optimization-for-binary_to_term.patch of Package erlang

From 753b6e95bc09923299db1ff5062629b860a15645 Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Thu, 24 Apr 2025 20:22:55 +0200
Subject: [PATCH] erts: Quick and dirty optimization for binary_to_term

Struct ErtsDistExternal contains large atom cache table (64kb)
which is not used by binary_to_term and just consumes stack space...

..and CPU if passing compile option -ftrivial-auto-var-init
---
 erts/emulator/beam/external.c | 14 ++++++++++----
 erts/emulator/beam/external.h | 15 ++++++++++++---
 2 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/erts/emulator/beam/external.c b/erts/emulator/beam/external.c
index 32affb6b6c..69ac129095 100644
--- a/erts/emulator/beam/external.c
+++ b/erts/emulator/beam/external.c
@@ -117,6 +117,11 @@ static void store_in_vec(TTBEncodeContext *ctx, byte *ep, Binary *ohbin, Eterm o
 static Uint32 calc_iovec_fun_size(SysIOVec* iov, Uint32 fun_high_ix, byte* size_p);
 
 void erts_init_external(void) {
+    ERTS_CT_ASSERT(offsetof(ErtsDistExternalFake,data) ==
+                   offsetof(ErtsDistExternal,data));
+    ERTS_CT_ASSERT(offsetof(ErtsDistExternalFake,flags) ==
+                   offsetof(ErtsDistExternal,flags));
+
     erts_init_trap_export(&term_to_binary_trap_export,
 			  am_erts_internal, am_term_to_binary_trap, 1,
 			  &term_to_binary_trap_1);
@@ -1302,7 +1307,8 @@ erts_decode_dist_ext(ErtsHeapFactory* factory,
 
 Eterm erts_decode_ext(ErtsHeapFactory* factory, const byte **ext, Uint32 flags)
 {
-    ErtsDistExternal ede, *edep;
+    ErtsDistExternalFake ede;
+    ErtsDistExternal *edep;
     Eterm obj;
     const byte *ep = *ext;
     if (*ep++ != VERSION_MAGIC) {
@@ -1313,7 +1319,7 @@ Eterm erts_decode_ext(ErtsHeapFactory* factory, const byte **ext, Uint32 flags)
         ASSERT(flags == ERTS_DIST_EXT_BTT_SAFE);
         ede.flags = flags; /* a dummy struct just for the flags */
         ede.data = NULL;
-        edep = &ede;
+        edep = (ErtsDistExternal*) &ede;
     } else {
         edep = NULL;
     }
@@ -2045,10 +2051,10 @@ static BIF_RETTYPE binary_to_term_int(Process* p, Eterm bin, B2TContext *ctx)
         case B2TDecodeTuple:
         case B2TDecodeString:
         case B2TDecodeBinary: {
-	    ErtsDistExternal fakedep;
+	    ErtsDistExternalFake fakedep;
             fakedep.flags = ctx->flags;
             fakedep.data = NULL;
-            dec_term(&fakedep, NULL, NULL, NULL, ctx, 0);
+            dec_term((ErtsDistExternal*)&fakedep, NULL, NULL, NULL, ctx, 0);
             break;
 	}
         case B2TDecodeFail:
diff --git a/erts/emulator/beam/external.h b/erts/emulator/beam/external.h
index ce27423ff6..59fc9edc99 100644
--- a/erts/emulator/beam/external.h
+++ b/erts/emulator/beam/external.h
@@ -142,15 +142,24 @@ struct erl_dist_external_data {
 };
 
 typedef struct erl_dist_external {
-    Sint heap_size;
-    DistEntry *dep;
+    ErtsDistExternalData *data;
     Uint32 flags;
+
     Uint32 connection_id;
-    ErtsDistExternalData *data;
+    Sint heap_size;
+    DistEntry *dep;
     struct ErtsMonLnkDist__ *mld;   /* copied from DistEntry.mld */
     ErtsAtomTranslationTable attab;
 } ErtsDistExternal;
 
+/* This fake one is used to impersonate ErtsDistExternal for dec_term()
+ * just for the flags without a large unused ErtsAtomTranslationTable.
+ */
+typedef struct {
+    ErtsDistExternalData *data;
+    Uint32 flags;
+} ErtsDistExternalFake;
+
 typedef struct {
     byte *extp;
     int exttmp;
-- 
2.43.0

openSUSE Build Service is sponsored by