From 1ff0460b0d47345d8ab4c8ff547904f91f36978b Mon Sep 17 00:00:00 2001 From: Helmut Eller Date: Wed, 8 May 2024 11:36:05 +0200 Subject: [PATCH 2/3] Fix bignums 32-bit machines * src/igc.h (struct igc_bignum_header): Can't define zero width bitfields. * src/igc.c (fix_terminal, igc_make_image_cache): Allow compilation if not HAVE_WINDOW_SYSTEM. * src/pdumper.c (dump_bignum): Implement it. --- src/igc.c | 4 ++++ src/igc.h | 2 ++ src/pdumper.c | 12 +++++++++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/igc.c b/src/igc.c index 15b91e32ffb..0168d6c7085 100644 --- a/src/igc.c +++ b/src/igc.c @@ -1648,7 +1648,9 @@ fix_terminal (mps_ss_t ss, struct terminal *t) { IGC_FIX_CALL_FN (ss, struct Lisp_Vector, t, fix_vectorlike); IGC_FIX12_RAW (ss, &t->next_terminal); +#ifdef HAVE_WINDOW_SYSTEM IGC_FIX12_RAW (ss, &t->image_cache); +#endif // These are malloc'd, so they can be accessed. IGC_FIX_CALL_FN (ss, struct coding_system, t->keyboard_coding, fix_coding); IGC_FIX_CALL_FN (ss, struct coding_system, t->terminal_coding, fix_coding); @@ -3010,12 +3012,14 @@ igc_make_ptr_vec (size_t n) return alloc (n * sizeof (void *), IGC_OBJ_PTR_VEC, PVEC_FREE); } +#ifdef HAVE_WINDOW_SYSTEM struct image_cache * igc_make_image_cache (void) { struct image_cache *c = alloc (sizeof *c, IGC_OBJ_IMAGE_CACHE, PVEC_FREE); return c; } +#endif DEFUN ("igc-make-weak-ref", Figc_make_weak_ref, Sigc_make_weak_ref, 1, 1, 0, doc diff --git a/src/igc.h b/src/igc.h index d6c9fd486d9..85454cfd6f0 100644 --- a/src/igc.h +++ b/src/igc.h @@ -108,7 +108,9 @@ #define EMACS_IGC_H size_t nlimbs : PSEUDOVECTOR_SIZE_BITS + PSEUDOVECTOR_REST_BITS - 1; size_t sign_bit : 1; size_t type : 6; +#if BITS_PER_BITS_WORD > 32 size_t unused : (BITS_PER_BITS_WORD - 32); +#endif size_t pvec_bit : 1; size_t mark_bit : 1; } bits; diff --git a/src/pdumper.c b/src/pdumper.c index 6fa0392b3e6..feed180e0d8 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -2236,7 +2236,17 @@ dump_finalizer (struct dump_context *ctx, static dump_off dump_bignum (struct dump_context *ctx, Lisp_Object object) { - emacs_abort (); + struct Lisp_Bignum *i = XBIGNUM (object); + struct igc_bignum_header h = { .u.word = i->header.size }; + dump_align_output (ctx, DUMP_ALIGNMENT); + eassert (ctx->offset >= ctx->header.cold_start); + dump_off offset = ctx->offset; + ptrdiff_t nbytes + = sizeof (struct Lisp_Bignum) + h.u.bits.nlimbs * sizeof (size_t); + if (nbytes > DUMP_OFF_MAX) + error ("bignum too large"); + dump_write (ctx, i, ptrdiff_t_to_dump_off (nbytes)); + return offset; } #else static dump_off -- 2.39.2