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