From a61d8752bfc390df45d8b66c30f81dc5ed5ac2ef Mon Sep 17 00:00:00 2001 From: Helmut Eller Date: Mon, 17 Jun 2024 19:47:04 +0200 Subject: [PATCH] Don't dump lispfwd objects The forwarding structs already exist in the data or bss section. They are all created with DEFVAR_INT and similar macros. Instead of creating new structs in the dump, create relocs to the data section. * src/pdumper.c (dump_field_fwd): New. (dump_blv, dump_symbol): Use it. (dump_pre_dump_symbol): Don't dump fwd objects. --- src/pdumper.c | 67 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 20 deletions(-) diff --git a/src/pdumper.c b/src/pdumper.c index c824da06b5e..f0996cea08c 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -2474,6 +2474,51 @@ dump_fwd (struct dump_context *ctx, lispfwd fwd) return offset; } +static void +dump_field_fwd (struct dump_context *ctx, void *out, const void *in_start, + const lispfwd *in_field) +{ + dump_field_emacs_ptr (ctx, out, in_start, in_field); + switch (XFWDTYPE (*in_field)) + { + case Lisp_Fwd_Int: + { + const struct Lisp_Intfwd *fwd = in_field->fwdptr; + dump_emacs_reloc_immediate_intmax_t (ctx, fwd->intvar, *fwd->intvar); + } + break; + case Lisp_Fwd_Bool: + { + const struct Lisp_Boolfwd *fwd = in_field->fwdptr; + dump_emacs_reloc_immediate_bool (ctx, fwd->boolvar, *fwd->boolvar); + } + break; + case Lisp_Fwd_Obj: + { + const struct Lisp_Objfwd *fwd = in_field->fwdptr; + if (NILP (Fgethash (dump_off_to_lisp (emacs_offset (fwd->objvar)), + ctx->staticpro_table, Qnil))) + dump_emacs_reloc_to_lv (ctx, fwd->objvar, *fwd->objvar); + } + break; + case Lisp_Fwd_Kboard_Obj: + break; + case Lisp_Fwd_Buffer_Obj: + { + const struct Lisp_Buffer_Objfwd *fwd = in_field->fwdptr; + dump_emacs_reloc_immediate (ctx, &fwd->type, &fwd->type, + sizeof fwd->type); + dump_emacs_reloc_immediate (ctx, &fwd->offset, &fwd->offset, + sizeof fwd->offset); + eassert (SYMBOLP (fwd->predicate)); + /* FIXME: assumes symbols are represented as offsets from lispsym */ + dump_emacs_reloc_immediate (ctx, &fwd->predicate, &fwd->predicate, + sizeof fwd->predicate); + } + break; + } +} + static dump_off dump_blv (struct dump_context *ctx, const struct Lisp_Buffer_Local_Value *blv) @@ -2486,16 +2531,11 @@ dump_blv (struct dump_context *ctx, DUMP_FIELD_COPY (&out, blv, local_if_set); DUMP_FIELD_COPY (&out, blv, found); if (blv->fwd.fwdptr) - dump_field_fixup_later (ctx, &out, blv, &blv->fwd.fwdptr); + dump_field_fwd (ctx, &out, blv, &blv->fwd); dump_field_lv (ctx, &out, blv, &blv->where, WEIGHT_NORMAL); dump_field_lv (ctx, &out, blv, &blv->defcell, WEIGHT_STRONG); dump_field_lv (ctx, &out, blv, &blv->valcell, WEIGHT_STRONG); dump_off offset = dump_object_finish (ctx, &out, sizeof (out)); - if (blv->fwd.fwdptr) - dump_remember_fixup_ptr_raw - (ctx, - offset + dump_offsetof (struct Lisp_Buffer_Local_Value, fwd), - dump_fwd (ctx, blv->fwd)); return offset; } @@ -2529,10 +2569,6 @@ dump_pre_dump_symbol (struct dump_context *ctx, struct Lisp_Symbol *symbol) dump_remember_symbol_aux (ctx, symbol_lv, dump_blv (ctx, symbol->u.s.val.blv)); break; - case SYMBOL_FORWARDED: - dump_remember_symbol_aux (ctx, symbol_lv, - dump_fwd (ctx, symbol->u.s.val.fwd)); - break; default: break; } @@ -2600,7 +2636,7 @@ dump_symbol (struct dump_context *ctx, dump_field_fixup_later (ctx, &out, symbol, &symbol->u.s.val.blv); break; case SYMBOL_FORWARDED: - dump_field_fixup_later (ctx, &out, symbol, &symbol->u.s.val.fwd); + dump_field_fwd (ctx, &out, symbol, &symbol->u.s.val.fwd); break; default: emacs_abort (); @@ -2624,15 +2660,6 @@ dump_symbol (struct dump_context *ctx, ? aux_offset : dump_blv (ctx, symbol->u.s.val.blv))); break; - case SYMBOL_FORWARDED: - aux_offset = dump_recall_symbol_aux (ctx, make_lisp_symbol (symbol)); - dump_remember_fixup_ptr_raw - (ctx, - offset + dump_offsetof (struct Lisp_Symbol, u.s.val.fwd), - (aux_offset - ? aux_offset - : dump_fwd (ctx, symbol->u.s.val.fwd))); - break; default: break; } -- 2.39.2