From a89b85b556f3905d42b588042475dc56981073f3 Mon Sep 17 00:00:00 2001 From: Helmut Eller Date: Tue, 18 Jun 2024 18:12:11 +0200 Subject: [PATCH] Support dumping bignums * src/igc.h (enum igc_obj_type): Add IGC_OBJ_DUMPED_BIGNUM_DATA. * src/igc.h: Allow IGC_OBJ_DUMPED_BIGNUM_DATA in the usual places. * src/pdumper.c (dump_cold_bignum): Emit IGC_OBJ_DUMPED_BIGNUM_DATA headers. --- src/igc.c | 6 ++++++ src/igc.h | 1 + src/pdumper.c | 6 ++++++ 3 files changed, 13 insertions(+) diff --git a/src/igc.c b/src/igc.c index 7443973f033..b80d8e7251a 100644 --- a/src/igc.c +++ b/src/igc.c @@ -208,6 +208,7 @@ #define IGC_DEFINE_LIST(data) \ "IGC_OBJ_DUMPED_CHARSET_TABLE", "IGC_OBJ_DUMPED_CODE_SPACE_MASKS", "IGC_OBJ_DUMPED_BUFFER_TEXT", + "IGC_OBJ_DUMPED_BIGNUM_DATA", "IGC_OBJ_DUMPED_BYTES", }; @@ -1374,6 +1375,7 @@ dflt_scan_obj (mps_ss_t ss, mps_addr_t base_start, mps_addr_t base_limit, case IGC_OBJ_BYTES: case IGC_OBJ_DUMPED_CODE_SPACE_MASKS: case IGC_OBJ_DUMPED_BUFFER_TEXT: + case IGC_OBJ_DUMPED_BIGNUM_DATA: case IGC_OBJ_DUMPED_BYTES: /* Can occur in the dump. */ break; @@ -2691,6 +2693,7 @@ finalize (struct igc *gc, mps_addr_t base) case IGC_OBJ_DUMPED_CHARSET_TABLE: case IGC_OBJ_DUMPED_CODE_SPACE_MASKS: case IGC_OBJ_DUMPED_BUFFER_TEXT: + case IGC_OBJ_DUMPED_BIGNUM_DATA: case IGC_OBJ_DUMPED_BYTES: case IGC_OBJ_BYTES: case IGC_OBJ_NUM_TYPES: @@ -2862,6 +2865,7 @@ thread_ap (enum igc_obj_type type) case IGC_OBJ_DUMPED_CHARSET_TABLE: case IGC_OBJ_DUMPED_CODE_SPACE_MASKS: case IGC_OBJ_DUMPED_BUFFER_TEXT: + case IGC_OBJ_DUMPED_BIGNUM_DATA: case IGC_OBJ_DUMPED_BYTES: case IGC_OBJ_NUM_TYPES: emacs_abort (); @@ -3654,6 +3658,7 @@ builtin_obj_type_and_hash (size_t *hash, enum igc_obj_type type, void *client) if (type == IGC_OBJ_DUMPED_CHARSET_TABLE || type == IGC_OBJ_DUMPED_CODE_SPACE_MASKS || type == IGC_OBJ_DUMPED_BUFFER_TEXT + || type == IGC_OBJ_DUMPED_BIGNUM_DATA || type == IGC_OBJ_DUMPED_BYTES) { *hash = 0; @@ -3716,6 +3721,7 @@ igc_dump_finish_obj (void *client, enum igc_obj_type type, case IGC_OBJ_DUMPED_CHARSET_TABLE: case IGC_OBJ_DUMPED_CODE_SPACE_MASKS: case IGC_OBJ_DUMPED_BUFFER_TEXT: + case IGC_OBJ_DUMPED_BIGNUM_DATA: case IGC_OBJ_DUMPED_BYTES: is_in_dump = true; break; diff --git a/src/igc.h b/src/igc.h index f7833a713d8..55ef7d4d56c 100644 --- a/src/igc.h +++ b/src/igc.h @@ -54,6 +54,7 @@ #define EMACS_IGC_H IGC_OBJ_DUMPED_CHARSET_TABLE, IGC_OBJ_DUMPED_CODE_SPACE_MASKS, IGC_OBJ_DUMPED_BUFFER_TEXT, + IGC_OBJ_DUMPED_BIGNUM_DATA, IGC_OBJ_DUMPED_BYTES, IGC_OBJ_NUM_TYPES }; diff --git a/src/pdumper.c b/src/pdumper.c index 9147be38294..5a8dc2ad466 100644 --- a/src/pdumper.c +++ b/src/pdumper.c @@ -3584,6 +3584,9 @@ dump_cold_bignum (struct dump_context *ctx, Lisp_Object object) eassert (sz_nlimbs < DUMP_OFF_MAX); dump_align_output (ctx, alignof (mp_limb_t)); dump_off nlimbs = (dump_off) sz_nlimbs; +# ifdef HAVE_MPS + dump_igc_start_obj (ctx, IGC_OBJ_DUMPED_BIGNUM_DATA, n); +# endif Lisp_Object descriptor = list2 (dump_off_to_lisp (ctx->offset), dump_off_to_lisp (mpz_sgn (*n) < 0 ? -nlimbs : nlimbs)); @@ -3593,6 +3596,9 @@ dump_cold_bignum (struct dump_context *ctx, Lisp_Object object) mp_limb_t limb = mpz_getlimbn (*n, i); dump_write (ctx, &limb, sizeof (limb)); } +# ifdef HAVE_MPS + dump_igc_finish_obj (ctx); +# endif } #ifdef HAVE_NATIVE_COMP -- 2.39.2