[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
scratch/igc fa229560021 1/3: Remove unused code, including the mirroring
From: |
Gerd Moellmann |
Subject: |
scratch/igc fa229560021 1/3: Remove unused code, including the mirroring code |
Date: |
Tue, 18 Jun 2024 06:42:48 -0400 (EDT) |
branch: scratch/igc
commit fa229560021f5bd878238581490216953f3a4e61
Author: Gerd Möllmann <gerd@gnu.org>
Commit: Gerd Möllmann <gerd@gnu.org>
Remove unused code, including the mirroring code
---
src/igc.c | 961 +-------------------------------------------------------------
1 file changed, 3 insertions(+), 958 deletions(-)
diff --git a/src/igc.c b/src/igc.c
index 33ba5525f5e..6f59a2013e2 100644
--- a/src/igc.c
+++ b/src/igc.c
@@ -3759,898 +3759,6 @@ igc_dump_finish_obj (void *client, enum igc_obj_type
type,
return base + nbytes;
}
-
-/***********************************************************************
- Copying the dump
- ***********************************************************************/
-
-/* Copy object with base address BASE to MPS. BASE must be an object in
- the loaded dump. Ensure that the copy has the same hash as the copied
- object so that hash tables don't need to be re-hashed. Value is the
- base address of the copy. */
-
-static mps_addr_t
-copy_to_mps (mps_addr_t base)
-{
- igc_assert (pdumper_object_p (base));
- struct igc_header *h = base;
- mps_ap_t ap = thread_ap (h->obj_type);
- size_t nbytes = obj_size (h);
- igc_assert (nbytes >= sizeof (struct igc_fwd));
- mps_addr_t copy;
- do
- {
- mps_res_t res = mps_reserve (©, ap, nbytes);
- if (res != MPS_RES_OK)
- memory_full (0);
- memcpy (copy, base, nbytes);
- }
- while (!mps_commit (ap, copy, nbytes));
- return copy;
-}
-
-struct igc_mirror
-{
- Lisp_Object dump_to_mps;
- struct
- {
- size_t n, nbytes;
- } objs[IGC_OBJ_NUM_TYPES];
- struct
- {
- size_t n, nbytes;
- } pvec[PVEC_TAG_MAX + 1];
- struct
- {
- const char *msg;
- double time;
- } times[10];
- int ntimes;
-};
-
-static void
-record_time (struct igc_mirror *m, const char *msg)
-{
- igc_assert (m->ntimes < ARRAYELTS (m->times));
- m->times[m->ntimes].msg = msg;
- m->times[m->ntimes].time = float_time (Qnil);
- m->ntimes += 1;
-}
-
-static struct igc_mirror
-make_igc_mirror (void)
-{
- Lisp_Object nobj = make_fixnum (1000000);
- Lisp_Object ht = CALLN (Fmake_hash_table, QCtest, Qeq, QCsize, nobj);
- return (struct igc_mirror) { .dump_to_mps = ht };
-}
-
-static void
-print_mirror_stats (struct igc_mirror *m)
-{
- size_t ntotal = 0, nbytes_total = 0;
- fprintf (stderr, "--------------------------------------------------\n");
- fprintf (stderr, "%30s %8s %10s\n", "Type", "N", "Bytes");
- fprintf (stderr, "--------------------------------------------------\n");
- for (int i = 0; i < ARRAYELTS (m->objs); ++i)
- {
- fprintf (stderr, "%30s %8zu %10zu\n", obj_type_name (i), m->objs[i].n,
- m->objs[i].nbytes);
- ntotal += m->objs[i].n;
- nbytes_total += m->objs[i].nbytes;
- }
- fprintf (stderr, "--------------------------------------------------\n");
- fprintf (stderr, "%30s %8s %10s\n", "Type", "N", "Bytes");
- fprintf (stderr, "--------------------------------------------------\n");
- for (int i = 0; i < ARRAYELTS (m->pvec); ++i)
- fprintf (stderr, "%30s %8zu %10zu\n", pvec_type_name (i), m->pvec[i].n,
- m->pvec[i].nbytes);
- fprintf (stderr, "--------------------------------------------------\n");
- fprintf (stderr, "%30s %8zu %10zu\n", "Total", ntotal, nbytes_total);
- if (m->ntimes > 1)
- {
- fprintf (stderr, "--------------------------------------------------\n");
- for (int i = 1; i < m->ntimes; ++i)
- fprintf (stderr, "%30s %8.4fs\n", m->times[i].msg,
- m->times[i].time - m->times[i - 1].time);
- fprintf (stderr, "%30s %8.4fs\n", "Total time",
- m->times[m->ntimes - 1].time - m->times[0].time);
- }
-}
-
-static Lisp_Object
-pointer_to_fixnum (void *p)
-{
- igc_assert (is_aligned (p));
- uintptr_t w = (uintptr_t) p;
- return make_fixnum (w >> GCTYPEBITS);
-}
-
-static void *
-fixnum_to_pointer (Lisp_Object obj)
-{
- igc_assert (FIXNUMP (obj));
- uintptr_t w = XFIXNUM (obj);
- return (void *) (w << GCTYPEBITS);
-}
-
-static void
-record_copy (struct igc_mirror *m, void *dumped, void *copy)
-{
- Lisp_Object key = pointer_to_fixnum (dumped);
- igc_assert (fixnum_to_pointer (key) == dumped);
- Lisp_Object val = pointer_to_fixnum (copy);
- igc_assert (fixnum_to_pointer (val) == copy);
- Fputhash (key, val, m->dump_to_mps);
-
- struct igc_header *h = copy;
- m->objs[h->obj_type].n += 1;
- m->objs[h->obj_type].nbytes += obj_size (h);
-
- if (h->obj_type == IGC_OBJ_VECTOR)
- {
- struct Lisp_Vector *v = base_to_client (copy);
- int i = pseudo_vector_type (v);
- m->pvec[i].n += 1;
- m->pvec[i].nbytes += obj_size (h);
- }
-}
-
-static void *
-lookup_copy (struct igc_mirror *m, void *dumped)
-{
- Lisp_Object key = pointer_to_fixnum (dumped);
- Lisp_Object found = Fgethash (key, m->dump_to_mps, Qnil);
- return NILP (found) ? NULL : fixnum_to_pointer (found);
-}
-
-static void
-copy_dump (struct igc_mirror *m)
-{
- struct pdumper_object_it it = {0};
- void *org_base;
- while ((org_base = pdumper_next_object (&it)) != NULL)
- {
- struct igc_header *h = org_base;
- switch (h->obj_type)
- {
- case IGC_OBJ_INVALID:
- case IGC_OBJ_PAD:
- case IGC_OBJ_FWD:
- case IGC_OBJ_CONS:
- case IGC_OBJ_SYMBOL:
- case IGC_OBJ_INTERVAL:
- case IGC_OBJ_STRING:
- case IGC_OBJ_STRING_DATA:
- case IGC_OBJ_VECTOR:
- case IGC_OBJ_VECTOR_WEAK:
- case IGC_OBJ_ITREE_TREE:
- case IGC_OBJ_ITREE_NODE:
- case IGC_OBJ_IMAGE:
- case IGC_OBJ_IMAGE_CACHE:
- case IGC_OBJ_FACE:
- case IGC_OBJ_FACE_CACHE:
- case IGC_OBJ_FLOAT:
- case IGC_OBJ_BLV:
- case IGC_OBJ_PTR_VEC:
- case IGC_OBJ_OBJ_VEC:
- case IGC_OBJ_HASH_VEC:
- case IGC_OBJ_HANDLER:
- case IGC_OBJ_BYTES:
- case IGC_OBJ_NUM_TYPES:
- record_copy (m, org_base, copy_to_mps (org_base));
- break;
-
- case IGC_OBJ_BUILTIN_SYMBOL:
- case IGC_OBJ_BUILTIN_THREAD:
- case IGC_OBJ_BUILTIN_SUBR:
- break;
- case IGC_OBJ_DUMPED_FWD:
- case IGC_OBJ_DUMPED_CHARSET_TABLE:
- case IGC_OBJ_DUMPED_CODE_SPACE_MASKS:
- case IGC_OBJ_DUMPED_BUFFER_TEXT:
- case IGC_OBJ_DUMPED_BYTES:
- emacs_abort ();
- }
- }
- record_time (m, "Copy objects to MPS");
-}
-
-static void
-mirror_lisp_obj (struct igc_mirror *m, Lisp_Object *pobj)
-{
- mps_word_t *p = (mps_word_t *) pobj;
- mps_word_t word = *p;
- mps_word_t tag = word & IGC_TAG_MASK;
-
- if (tag == Lisp_Int0 || tag == Lisp_Int1)
- return;
- else if (tag == Lisp_Type_Unused0)
- emacs_abort ();
-
- if (tag == Lisp_Symbol)
- {
- ptrdiff_t off = word ^ tag;
- mps_addr_t client = (mps_addr_t) ((char *) lispsym + off);
- if (pdumper_object_p (client))
- {
- mps_addr_t base = client_to_base (client);
- mps_addr_t mirror = lookup_copy (m, base);
- igc_assert (mirror != NULL);
- client = base_to_client (mirror);
- ptrdiff_t new_off = (char *) client - (char *) lispsym;
- *p = new_off | tag;
- }
- }
- else
- {
- mps_addr_t client = (mps_addr_t) (word ^ tag);
- if (pdumper_object_p (client))
- {
- mps_addr_t base = client_to_base (client);
- mps_addr_t mirror = lookup_copy (m, base);
- igc_assert (mirror != NULL);
- client = base_to_client (mirror);
- *p = (mps_word_t) client | tag;
- }
- }
-}
-
-static void
-mirror_raw (struct igc_mirror *m, mps_addr_t *p)
-{
- mps_addr_t client = *p;
- if (pdumper_object_p (client))
- {
- mps_addr_t base = client_to_base (client);
- mps_addr_t mirror = lookup_copy (m, base);
- igc_assert (mirror != NULL);
- *p = base_to_client (mirror);
- }
-}
-
-#define IGC_MIRROR_OBJ(m, obj) mirror_lisp_obj ((m), (obj))
-#define IGC_MIRROR_RAW(m, pp) mirror_raw ((m), (mps_addr_t *) (pp))
-
-static void
-mirror_array (struct igc_mirror *m, Lisp_Object *array, size_t n)
-{
- for (size_t i = 0; i < n; ++i)
- IGC_MIRROR_OBJ (m, &array[i]);
-}
-
-#define IGC_MIRROR_NOBJS(m, a, n) mirror_array (m, a, n)
-
-static void
-mirror_fwd (struct igc_mirror *m, lispfwd fwd)
-{
- switch (XFWDTYPE (fwd))
- {
- case Lisp_Fwd_Int:
- case Lisp_Fwd_Bool:
- case Lisp_Fwd_Kboard_Obj:
- break;
-
- case Lisp_Fwd_Obj:
- {
- struct Lisp_Objfwd *o = (void *) fwd.fwdptr;
- IGC_MIRROR_OBJ (m, o->objvar);
- }
- break;
-
- case Lisp_Fwd_Buffer_Obj:
- {
- struct Lisp_Buffer_Objfwd *b = (void *) fwd.fwdptr;
- IGC_MIRROR_OBJ (m, &b->predicate);
- }
- break;
- }
-}
-
-static void
-mirror_symbol (struct igc_mirror *m, struct Lisp_Symbol *sym)
-{
- IGC_MIRROR_OBJ (m, &sym->u.s.name);
- IGC_MIRROR_OBJ (m, &sym->u.s.function);
- IGC_MIRROR_OBJ (m, &sym->u.s.plist);
-#ifdef IN_MY_FORK
- IGC_MIRROR_OBJ (m, &sym->u.s.package);
-#else
- IGC_MIRROR_RAW (m, &sym->u.s.next);
-#endif
- switch (sym->u.s.redirect)
- {
- case SYMBOL_PLAINVAL:
- IGC_MIRROR_OBJ (m, &sym->u.s.val.value);
- break;
-
- case SYMBOL_VARALIAS:
- IGC_MIRROR_RAW (m, &sym->u.s.val.alias);
- break;
-
- case SYMBOL_LOCALIZED:
- IGC_MIRROR_RAW (m, &sym->u.s.val.blv);
- break;
-
- case SYMBOL_FORWARDED:
- mirror_fwd (m, sym->u.s.val.fwd);
- break;
- }
-}
-
-static void
-mirror_string (struct igc_mirror *m, struct Lisp_String *s)
-{
- IGC_MIRROR_RAW (m, &s->u.s.data);
- IGC_MIRROR_RAW (m, &s->u.s.intervals);
-}
-
-static void
-mirror_interval (struct igc_mirror *m, struct interval *i)
-{
- IGC_MIRROR_RAW (m, &i->left);
- IGC_MIRROR_RAW (m, &i->right);
- if (i->up_obj)
- IGC_MIRROR_OBJ (m, &i->up.obj);
- else if (i->up.interval)
- IGC_MIRROR_RAW (m, &i->up.interval);
- IGC_MIRROR_OBJ (m, &i->plist);
-}
-
-static void
-mirror_itree_tree (struct igc_mirror *m, struct itree_tree *t)
-{
- IGC_NOT_IMPLEMENTED ();
-}
-
-static void
-mirror_itree_node (struct igc_mirror *m, struct itree_node *n)
-{
- if (n->parent)
- IGC_MIRROR_RAW (m, &n->parent);
- if (n->left)
- IGC_MIRROR_RAW (m, &n->left);
- if (n->right)
- IGC_MIRROR_RAW (m, &n->right);
- IGC_MIRROR_OBJ (m, &n->data);
-}
-
-static void
-mirror_image (struct igc_mirror *m, struct image *i)
-{
- IGC_NOT_IMPLEMENTED ();
-}
-
-static void
-mirror_image_cache (struct igc_mirror *m, struct image_cache *c)
-{
- IGC_NOT_IMPLEMENTED ();
-}
-
-static void
-mirror_face (struct igc_mirror *m, struct face *f)
-{
- IGC_NOT_IMPLEMENTED ();
-}
-
-static void
-mirror_face_cache (struct igc_mirror *m, struct face_cache *c)
-{
- IGC_NOT_IMPLEMENTED ();
-}
-
-static void
-mirror_ptr_vec (struct igc_mirror *m, void *p)
-{
- IGC_NOT_IMPLEMENTED ();
-}
-
-static void
-mirror_obj_vec (struct igc_mirror *m, Lisp_Object *v)
-{
- size_t n = object_nelems (v, sizeof *v);
- for (size_t i = 0; i < n; ++i)
- IGC_MIRROR_OBJ (m, &v[i]);
-}
-
-static void
-mirror_handler (struct igc_mirror *m, struct handler *h)
-{
- IGC_NOT_IMPLEMENTED ();
-}
-
-static void
-mirror_cons (struct igc_mirror *m, struct Lisp_Cons *c)
-{
- IGC_MIRROR_OBJ (m, &c->u.s.car);
- IGC_MIRROR_OBJ (m, &c->u.s.u.cdr);
-}
-
-static void
-mirror_blv (struct igc_mirror *m, struct Lisp_Buffer_Local_Value *blv)
-{
- IGC_MIRROR_OBJ (m, &blv->where);
- IGC_MIRROR_OBJ (m, &blv->defcell);
- IGC_MIRROR_OBJ (m, &blv->valcell);
-}
-
-static void
-mirror_vectorlike_ (struct igc_mirror *m, struct Lisp_Vector *v)
-{
- ptrdiff_t size = vector_size (v);
- IGC_MIRROR_NOBJS (m, v->contents, size);
-}
-
-#define IGC_MIRROR_VECTORLIKE(m, v) \
- mirror_vectorlike_ ((m), (struct Lisp_Vector *) (v))
-
-#ifndef IN_MY_FORK
-static void
-mirror_obarray (struct igc_mirror *m, struct Lisp_Obarray *o)
-{
- IGC_MIRROR_RAW (m, &o->buckets);
-}
-#endif
-
-static void
-mirror_font (struct igc_mirror *m, struct Lisp_Vector *v)
-{
- IGC_MIRROR_VECTORLIKE (m, v);
- switch (vector_size (v))
- {
- case FONT_SPEC_MAX:
- case FONT_ENTITY_MAX:
- break;
-
- case FONT_OBJECT_MAX:
- {
- struct font *f = (struct font *) v;
- Lisp_Object const *type = &f->driver->type;
- IGC_MIRROR_OBJ (m, igc_const_cast (Lisp_Object *, type));
- }
- break;
-
- default:
- emacs_abort ();
- }
-}
-
-static void
-mirror_mutex (struct igc_mirror *m, struct Lisp_Mutex *x)
-{
- IGC_NOT_IMPLEMENTED ();
-}
-
-static void
-mirror_buffer (struct igc_mirror *m, struct buffer *b)
-{
- IGC_MIRROR_VECTORLIKE (m, b);
- IGC_MIRROR_RAW (m, &b->own_text.intervals);
- IGC_MIRROR_OBJ (m, &b->own_text.markers);
- IGC_MIRROR_RAW (m, &b->overlays);
-
- IGC_MIRROR_RAW (m, &b->base_buffer);
- if (b->base_buffer)
- b->text = &b->base_buffer->own_text;
- else
- b->text = &b->own_text;
-
- IGC_MIRROR_OBJ (m, &b->undo_list_);
-}
-
-static void
-mirror_frame (struct igc_mirror *m, struct frame *f)
-{
- IGC_MIRROR_VECTORLIKE (m, f);
- IGC_MIRROR_RAW (m, &f->face_cache);
- if (f->terminal)
- IGC_MIRROR_RAW (m, &f->terminal);
-#ifdef HAVE_WINDOW_SYSTEM
- igc_assert (!FRAME_WINDOW_P (f));
-#endif
-}
-
-static void
-mirror_window (struct igc_mirror *m, struct window *w)
-{
- IGC_MIRROR_VECTORLIKE (m, w);
- igc_assert (w->current_matrix == NULL);
- igc_assert (w->desired_matrix == NULL);
- IGC_MIRROR_OBJ (m, &w->prev_buffers);
- IGC_MIRROR_OBJ (m, &w->next_buffers);
-}
-
-static void
-mirror_hash_table (struct igc_mirror *m, struct Lisp_Hash_Table *h)
-{
- IGC_MIRROR_RAW (m, &h->key);
- IGC_MIRROR_RAW (m, &h->value);
- IGC_MIRROR_RAW (m, &h->hash);
- IGC_MIRROR_RAW (m, &h->next);
- IGC_MIRROR_RAW (m, &h->index);
- igc_assert (!pdumper_object_p (h->key));
- igc_assert (!pdumper_object_p (h->value));
-}
-
-static void
-mirror_char_table (struct igc_mirror *m, struct Lisp_Vector *v)
-{
- for (size_t i = vector_start (v), n = vector_size (v); i < n; ++i)
- IGC_MIRROR_OBJ (m, &v->contents[i]);
-}
-
-static void
-mirror_overlay (struct igc_mirror *m, struct Lisp_Overlay *o)
-{
- IGC_MIRROR_RAW (m, &o->buffer);
- IGC_MIRROR_OBJ (m, &o->plist);
- IGC_MIRROR_RAW (m, &o->interval);
-}
-
-static void
-mirror_subr (struct igc_mirror *m, struct Lisp_Subr *s)
-{
- IGC_MIRROR_OBJ (m, &s->command_modes);
-#ifdef HAVE_NATIVE_COMP
- IGC_MIRROR_OBJ (m, &s->intspec.native);
- IGC_MIRROR_OBJ (m, &s->command_modes);
- IGC_MIRROR_OBJ (m, &s->native_comp_u);
- IGC_MIRROR_OBJ (m, &s->lambda_list);
- IGC_MIRROR_OBJ (m, &s->type);
-#endif
-}
-
-static void
-mirror_misc_ptr (struct igc_mirror *m, struct Lisp_Misc_Ptr *p)
-{
- IGC_NOT_IMPLEMENTED ();
-}
-
-static void
-mirror_user_ptr (struct igc_mirror *m, struct Lisp_User_Ptr *p)
-{
- IGC_NOT_IMPLEMENTED ();
-}
-
-static void
-mirror_thread (struct igc_mirror *m, struct thread_state *s)
-{
- IGC_MIRROR_VECTORLIKE (m, s);
- IGC_MIRROR_RAW (m, &s->m_current_buffer);
- IGC_MIRROR_RAW (m, &s->next_thread);
- IGC_MIRROR_RAW (m, &s->m_handlerlist);
-}
-
-static void
-mirror_terminal (struct igc_mirror *m, struct terminal *t)
-{
- IGC_NOT_IMPLEMENTED ();
-}
-
-static void
-mirror_marker (struct igc_mirror *m, struct Lisp_Marker *ma)
-{
- IGC_MIRROR_RAW (m, &ma->buffer);
-}
-
-static void
-mirror_finalizer (struct igc_mirror *m, struct Lisp_Finalizer *f)
-{
- IGC_NOT_IMPLEMENTED ();
-}
-
-static void
-mirror_comp_unit (struct igc_mirror *m, struct Lisp_Native_Comp_Unit *u)
-{
- IGC_MIRROR_VECTORLIKE (m, u);
-}
-
-#ifdef HAVE_XWIDGETS
-static void
-mirror_xwidget (struct igc_mirror *m, struct xwidget *w)
-{
- IGC_NOT_IMPLEMENTED ();
-}
-
-static void
-mirror_xwidget_view (struct igc_mirror *m, struct xwidget_view *v)
-{
- IGC_NOT_IMPLEMENTED ();
-}
-#endif
-
-#ifdef HAVE_MODULES
-static void
-mirror_global_ref (struct igc_mirror *m, struct module_global_reference *r)
-{
- IGC_NOT_IMPLEMENTED ();
-}
-#endif
-
-static void
-mirror_vector (struct igc_mirror *m, void *client)
-{
- switch (pseudo_vector_type (client))
- {
-#ifndef IN_MY_FORK
- case PVEC_OBARRAY:
- mirror_obarray (m, client);
- break;
-#endif
-
- case PVEC_BUFFER:
- mirror_buffer (m, client);
- break;
-
- case PVEC_FRAME:
- mirror_frame (m, client);
- break;
-
- case PVEC_WINDOW:
- mirror_window (m, client);
- break;
-
- case PVEC_HASH_TABLE:
- mirror_hash_table (m, client);
- break;
-
- case PVEC_CHAR_TABLE:
- case PVEC_SUB_CHAR_TABLE:
- mirror_char_table (m, client);
- break;
-
- case PVEC_BOOL_VECTOR:
- break;
-
- case PVEC_OVERLAY:
- mirror_overlay (m, client);
- break;
-
- case PVEC_SUBR:
- mirror_subr (m, client);
- break;
-
- case PVEC_FREE:
- emacs_abort ();
-
- case PVEC_FINALIZER:
- mirror_finalizer (m, client);
- break;
-
- case PVEC_MISC_PTR:
- mirror_misc_ptr (m, client);
- break;
-
- case PVEC_USER_PTR:
- mirror_user_ptr (m, client);
- break;
-
-#ifdef HAVE_XWIDGETS
- case PVEC_XWIDGET:
- mirror_xwidget (c, client);
- break;
-
- case PVEC_XWIDGET_VIEW:
- mirror_widget_view (c, client);
- break;
-#endif
-
- case PVEC_THREAD:
- mirror_thread (m, client);
- break;
-
- case PVEC_MUTEX:
- mirror_mutex (m, client);
- break;
-
- case PVEC_TERMINAL:
- mirror_terminal (m, client);
- break;
-
- case PVEC_MARKER:
- mirror_marker (m, client);
- break;
-
- case PVEC_BIGNUM:
- break;
-
- case PVEC_NATIVE_COMP_UNIT:
- mirror_comp_unit (m, client);
- break;
-
- case PVEC_MODULE_GLOBAL_REFERENCE:
-#ifdef HAVE_MODULES
- mirror_global_ref (m, client);
-#endif
- break;
-
- case PVEC_FONT:
- mirror_font (m, client);
- break;
-
- case PVEC_NORMAL_VECTOR:
- case PVEC_SYMBOL_WITH_POS:
- case PVEC_PROCESS:
- case PVEC_WINDOW_CONFIGURATION:
- case PVEC_XWIDGET:
- case PVEC_XWIDGET_VIEW:
- case PVEC_MODULE_FUNCTION:
- case PVEC_CONDVAR:
- case PVEC_TS_COMPILED_QUERY:
- case PVEC_TS_NODE:
- case PVEC_TS_PARSER:
- case PVEC_SQLITE:
- case PVEC_CLOSURE:
- case PVEC_RECORD:
- case PVEC_OTHER:
-#ifdef IN_MY_FORK
- case PVEC_PACKAGE:
-#endif
- IGC_MIRROR_VECTORLIKE (m, client);
- break;
- }
-}
-
-static void
-mirror (struct igc_mirror *m, void *org_base, void *copy_base)
-{
- void *client = base_to_client (copy_base);
- struct igc_header *h = copy_base;
- switch (h->obj_type)
- {
- case IGC_OBJ_BUILTIN_SYMBOL:
- case IGC_OBJ_BUILTIN_THREAD:
- case IGC_OBJ_BUILTIN_SUBR:
- break;
-
- case IGC_OBJ_PAD:
- case IGC_OBJ_FWD:
- case IGC_OBJ_INVALID:
- case IGC_OBJ_DUMPED_FWD:
- case IGC_OBJ_DUMPED_CHARSET_TABLE:
- case IGC_OBJ_DUMPED_CODE_SPACE_MASKS:
- case IGC_OBJ_DUMPED_BUFFER_TEXT:
- case IGC_OBJ_DUMPED_BYTES:
- case IGC_OBJ_NUM_TYPES:
- emacs_abort ();
-
- case IGC_OBJ_OBJ_VEC:
- case IGC_OBJ_HASH_VEC:
- mirror_obj_vec (m, client);
- break;
-
- case IGC_OBJ_HANDLER:
- mirror_handler (m, client);
- break;
-
- case IGC_OBJ_PTR_VEC:
- mirror_ptr_vec (m, client);
- break;
-
- case IGC_OBJ_CONS:
- mirror_cons (m, client);
- break;
-
- case IGC_OBJ_STRING_DATA:
- case IGC_OBJ_FLOAT:
- case IGC_OBJ_BYTES:
- break;
-
- case IGC_OBJ_SYMBOL:
- mirror_symbol (m, client);
- break;
-
- case IGC_OBJ_INTERVAL:
- mirror_interval (m, client);
- break;
-
- case IGC_OBJ_STRING:
- mirror_string (m, client);
- break;
-
- case IGC_OBJ_VECTOR:
- case IGC_OBJ_VECTOR_WEAK:
- mirror_vector (m, client);
- break;
-
- case IGC_OBJ_ITREE_TREE:
- mirror_itree_tree (m, client);
- break;
-
- case IGC_OBJ_ITREE_NODE:
- mirror_itree_node (m, client);
- break;
-
- case IGC_OBJ_IMAGE:
- mirror_image (m, client);
- break;
-
- case IGC_OBJ_IMAGE_CACHE:
- mirror_image_cache (m, client);
- break;
-
- case IGC_OBJ_FACE:
- mirror_face (m, client);
- break;
-
- case IGC_OBJ_FACE_CACHE:
- mirror_face_cache (m, client);
- break;
-
- case IGC_OBJ_BLV:
- mirror_blv (m, client);
- break;
- }
-}
-
-static void
-mirror_references (struct igc_mirror *m)
-{
- DOHASH (XHASH_TABLE (m->dump_to_mps), org_base, copy_base)
- mirror (m, fixnum_to_pointer (org_base), fixnum_to_pointer (copy_base));
- record_time (m, "Mirror references");
-}
-
-static void
-redirect_charset_table (struct igc_mirror *m)
-{
- /* charset_table points to a vector of struct charset, which contain a
- Lisp_Object. When dumping, charset_table contents are written to
- the dump. When loading a dump, charset_table is made to point to
- these charsets in the dump. When charset_table is enlarged,
- igc_xpalloc is used to make it a root, but until then, it is
- not. See also the comment in charset.c:1145. */
- igc_assert (pdumper_object_p (charset_table));
- const size_t nbytes = charset_table_size * sizeof *charset_table;
- struct charset *new_table = igc_xzalloc_ambig (nbytes);
- const size_t used_nbytes = charset_table_used * sizeof *charset_table;
- memcpy (new_table, charset_table, used_nbytes);
- charset_table = new_table;
-
- for (int i = 0; i < charset_table_used; ++i)
- IGC_MIRROR_OBJ (m, &charset_table[i].attributes);
-}
-
-/* Redirect all roots to point to MPS copies. */
-
-static void
-redirect_roots (struct igc_mirror *m)
-{
- for (int i = 0; i < staticidx; ++i)
- IGC_MIRROR_OBJ (m, igc_const_cast (Lisp_Object *, staticvec[i]));
-
- for (int i = 0; i < ARRAYELTS (lispsym); ++i)
- mirror_symbol (m, lispsym + i);
-
- mirror_buffer (m, &buffer_defaults);
- mirror_buffer (m, &buffer_local_symbols);
- mirror_thread (m, &main_thread.s);
- IGC_MIRROR_RAW (m, &terminal_list);
- redirect_charset_table (m);
-
- record_time (m, "Redirect roots");
-}
-
-/* Copy the dump [START, END) to MPS, and discard it. */
-
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-function"
-static void
-mirror_dump (void *start, void *end)
-{
- IGC_WITH_PARKED (global_igc)
- {
- struct igc_mirror m = make_igc_mirror ();
- record_time (&m, "Start");
- copy_dump (&m);
- mirror_references (&m);
- redirect_roots (&m);
-
- if (getenv ("IGC_MIRROR_STATS"))
- print_mirror_stats (&m);
- }
-}
-
static mps_addr_t pinned_objects_in_dump[3];
/* Called from pdumper_load. [START, END) is the hot section of the
@@ -4661,7 +3769,6 @@ igc_on_pdump_loaded (void *dump_base, void *hot_start,
void *hot_end,
void *cold_start, void *cold_end,
void *cold_user_data_start, void *heap_end)
{
- // mirror_dump (start, end);
igc_assert (global_igc->park_count > 0);
eassert (base_to_client (hot_start) == charset_table);
eassert (((struct igc_header *)cold_start)->obj_type
@@ -4671,14 +3778,16 @@ igc_on_pdump_loaded (void *dump_base, void *hot_start,
void *hot_end,
eassert (((struct igc_header *)heap_end)->obj_type == IGC_OBJ_DUMPED_BYTES);
size_t discardable_size = (uint8_t *)cold_start - (uint8_t *)hot_end;
- size_t dump_size = (uint8_t *)cold_end - (uint8_t *)dump_base;
// size_t cold_size = (uint8_t *)cold_end - (uint8_t *)cold_start;
size_t dump_header_size = (uint8_t *)hot_start - (uint8_t *)dump_base;
size_t relocs_size = (uint8_t *)cold_end - (uint8_t *)heap_end;
struct igc_header *h = client_to_base (dump_base);
igc_assert (h->obj_type == IGC_OBJ_INVALID);
igc_assert (obj_size (h) == sizeof *h + dump_size);
+#ifdef IGC_DEBUG
+ size_t dump_size = (uint8_t *)cold_end - (uint8_t *)dump_base;
igc_assert (discardable_size > 2 * sizeof *h);
+#endif
/* Ignore dump_header */
set_header (h, IGC_OBJ_PAD, sizeof *h + dump_header_size, 0);
/* Ignore discardable section */
@@ -4725,70 +3834,6 @@ igc_alloc_dump (size_t nbytes)
return base_to_client (block);
}
-struct gap_it
-{
- void *last_end;
- struct pdumper_object_it it;
-};
-
-static void *
-gap_it_next (void **gap_end, struct gap_it *it)
-{
- if (!it->last_end)
- {
- it->last_end = (void *)dump_public.start;
- return gap_it_next (gap_end, it);
- }
- else
- {
- for (;;)
- {
- struct igc_header *h = pdumper_next_object (&it->it);
- if (!h)
- {
- if (it->last_end == (void *)dump_public.end)
- return NULL;
- else
- {
- void *gap_start = it->last_end;
- it->last_end = *gap_end = (void *)dump_public.end;
- return gap_start;
- }
- }
- void *end = dflt_skip (h);
- if (it->last_end == h)
- {
- it->last_end = end;
- continue;
- }
- void *gap_start = it->last_end;
- *gap_end = h;
- it->last_end = end;
- return gap_start;
- }
- }
-}
-
-#if 0
-void
-print_gaps (size_t start, size_t len)
-{
- struct gap_it it = { 0 };
- for (size_t i = start; i < start + len; i++)
- {
- void *gap_end;
- void *gap_start = gap_it_next (&gap_end, &it);
- if (!gap_start)
- return;
- size_t offset = (size_t)gap_start - dump_public.start;
- size_t len = (size_t)gap_end - (size_t)gap_start;
- fprintf (stderr, "%p: %p %p %zu\n", (void *)offset, gap_start, gap_end,
- len);
- }
-}
-#endif
-
-
/***********************************************************************
Init
***********************************************************************/