+ void *varaddress;
+ size_t size;
+} pdump_opaque;
+
+typedef struct
+{
+ Dynarr_declare (pdump_opaque);
+} pdump_opaque_dynarr;
+
+typedef struct
+{
+ void **ptraddress;
+ const struct struct_description *desc;
+} pdump_root_struct_ptr;
+
+typedef struct
+{
+ Dynarr_declare (pdump_root_struct_ptr);
+} pdump_root_struct_ptr_dynarr;
+
+static pdump_opaque_dynarr *pdump_opaques;
+static pdump_root_struct_ptr_dynarr *pdump_root_struct_ptrs;
+static Lisp_Object_ptr_dynarr *pdump_root_objects;
+static Lisp_Object_ptr_dynarr *pdump_weak_object_chains;
+
+/* Mark SIZE bytes at non-heap address VARADDRESS for dumping as is,
+ without any bit-twiddling. */
+void
+dump_add_opaque (void *varaddress, size_t size)
+{
+ pdump_opaque info;
+ info.varaddress = varaddress;
+ info.size = size;
+ if (pdump_opaques == NULL)
+ pdump_opaques = Dynarr_new (pdump_opaque);
+ Dynarr_add (pdump_opaques, info);
+}
+
+/* Mark the struct described by DESC and pointed to by the pointer at
+ non-heap address VARADDRESS for dumping.
+ All the objects reachable from this pointer will also be dumped. */
+void
+dump_add_root_struct_ptr (void *ptraddress, const struct struct_description *desc)
+{
+ pdump_root_struct_ptr info;
+ info.ptraddress = (void **) ptraddress;
+ info.desc = desc;
+ if (pdump_root_struct_ptrs == NULL)
+ pdump_root_struct_ptrs = Dynarr_new (pdump_root_struct_ptr);
+ Dynarr_add (pdump_root_struct_ptrs, info);
+}
+
+/* Mark the Lisp_Object at non-heap address VARADDRESS for dumping.
+ All the objects reachable from this var will also be dumped. */
+void
+dump_add_root_object (Lisp_Object *varaddress)
+{
+ if (pdump_root_objects == NULL)
+ pdump_root_objects = Dynarr_new2 (Lisp_Object_ptr_dynarr, Lisp_Object *);
+ Dynarr_add (pdump_root_objects, varaddress);
+}
+
+/* Mark the list pointed to by the Lisp_Object at VARADDRESS for dumping. */
+void
+dump_add_weak_object_chain (Lisp_Object *varaddress)
+{
+ if (pdump_weak_object_chains == NULL)
+ pdump_weak_object_chains = Dynarr_new2 (Lisp_Object_ptr_dynarr, Lisp_Object *);
+ Dynarr_add (pdump_weak_object_chains, varaddress);
+}
+\f
+
+typedef struct
+{