comparison src/dumper.c @ 460:223736d75acb r21-2-45

Import from CVS: tag r21-2-45
author cvs
date Mon, 13 Aug 2007 11:43:24 +0200
parents c33ae14dd6d0
children 0784d089fdc9
comparison
equal deleted inserted replaced
459:9d4fd877b885 460:223736d75acb
22 /* Synched up with: Not in FSF. */ 22 /* Synched up with: Not in FSF. */
23 23
24 #include <config.h> 24 #include <config.h>
25 #include "lisp.h" 25 #include "lisp.h"
26 26
27 #include "dump-id.h"
28 #include "specifier.h" 27 #include "specifier.h"
29 #include "elhash.h" 28 #include "elhash.h"
30 #include "sysfile.h" 29 #include "sysfile.h"
31 #include "console-stream.h" 30 #include "console-stream.h"
32 #include "dumper.h" 31 #include "dumper.h"
225 static HANDLE pdump_hMap = INVALID_HANDLE_VALUE; 224 static HANDLE pdump_hMap = INVALID_HANDLE_VALUE;
226 #endif 225 #endif
227 226
228 static void (*pdump_free) (void); 227 static void (*pdump_free) (void);
229 228
230 static const unsigned char pdump_align_table[256] = 229 static unsigned char pdump_align_table[] =
231 { 230 {
232 8, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 231 64, 1, 2, 1, 4, 1, 2, 1, 8, 1, 2, 1, 4, 1, 2, 1,
233 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 232 16, 1, 2, 1, 4, 1, 2, 1, 8, 1, 2, 1, 4, 1, 2, 1,
234 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 233 32, 1, 2, 1, 4, 1, 2, 1, 8, 1, 2, 1, 4, 1, 2, 1,
235 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 234 16, 1, 2, 1, 4, 1, 2, 1, 8, 1, 2, 1, 4, 1, 2, 1
236 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
237 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
238 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
239 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
240 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
241 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
242 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
243 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
244 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
245 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
246 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
247 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
248 }; 235 };
249 236
250 typedef struct pdump_entry_list_elmt 237 static inline unsigned int
251 { 238 pdump_size_to_align (size_t size)
252 struct pdump_entry_list_elmt *next; 239 {
240 return pdump_align_table[size % countof (pdump_align_table)];
241 }
242
243 typedef struct pdump_entry_list_elt
244 {
245 struct pdump_entry_list_elt *next;
253 const void *obj; 246 const void *obj;
254 size_t size; 247 size_t size;
255 int count; 248 int count;
256 EMACS_INT save_offset; 249 EMACS_INT save_offset;
257 } pdump_entry_list_elmt; 250 } pdump_entry_list_elt;
258 251
259 typedef struct 252 typedef struct
260 { 253 {
261 pdump_entry_list_elmt *first; 254 pdump_entry_list_elt *first;
262 int align; 255 int align;
263 int count; 256 int count;
264 } pdump_entry_list; 257 } pdump_entry_list;
265 258
266 typedef struct pdump_struct_list_elmt 259 typedef struct pdump_struct_list_elt
267 { 260 {
268 pdump_entry_list list; 261 pdump_entry_list list;
269 const struct struct_description *sdesc; 262 const struct struct_description *sdesc;
270 } pdump_struct_list_elmt; 263 } pdump_struct_list_elt;
271 264
272 typedef struct 265 typedef struct
273 { 266 {
274 pdump_struct_list_elmt *list; 267 pdump_struct_list_elt *list;
275 int count; 268 int count;
276 int size; 269 int size;
277 } pdump_struct_list; 270 } pdump_struct_list;
278 271
279 static pdump_entry_list pdump_object_table[256]; 272 static pdump_entry_list *pdump_object_table;
280 static pdump_entry_list pdump_opaque_data_list; 273 static pdump_entry_list pdump_opaque_data_list;
281 static pdump_struct_list pdump_struct_table; 274 static pdump_struct_list pdump_struct_table;
282 275
283 static int pdump_alert_undump_object[256]; 276 static int *pdump_alert_undump_object;
284 277
285 static unsigned long cur_offset; 278 static unsigned long cur_offset;
286 static size_t max_size; 279 static size_t max_size;
287 static int pdump_fd; 280 static int pdump_fd;
288 static void *pdump_buf; 281 static void *pdump_buf;
289 static FILE *pdump_out; 282 static FILE *pdump_out;
290 283
291 #define PDUMP_HASHSIZE 200001 284 #define PDUMP_HASHSIZE 200001
292 285
293 static pdump_entry_list_elmt **pdump_hash; 286 static pdump_entry_list_elt **pdump_hash;
294 287
295 /* Since most pointers are eight bytes aligned, the >>3 allows for a better hash */ 288 /* Since most pointers are eight bytes aligned, the >>3 allows for a better hash */
296 static int 289 static int
297 pdump_make_hash (const void *obj) 290 pdump_make_hash (const void *obj)
298 { 291 {
299 return ((unsigned long)(obj)>>3) % PDUMP_HASHSIZE; 292 return ((unsigned long)(obj)>>3) % PDUMP_HASHSIZE;
300 } 293 }
301 294
302 static pdump_entry_list_elmt * 295 static pdump_entry_list_elt *
303 pdump_get_entry (const void *obj) 296 pdump_get_entry (const void *obj)
304 { 297 {
305 int pos = pdump_make_hash (obj); 298 int pos = pdump_make_hash (obj);
306 pdump_entry_list_elmt *e; 299 pdump_entry_list_elt *e;
307 300
308 assert (obj != 0); 301 assert (obj != 0);
309 302
310 while ((e = pdump_hash[pos]) != 0) 303 while ((e = pdump_hash[pos]) != 0)
311 { 304 {
321 314
322 static void 315 static void
323 pdump_add_entry (pdump_entry_list *list, const void *obj, size_t size, 316 pdump_add_entry (pdump_entry_list *list, const void *obj, size_t size,
324 int count) 317 int count)
325 { 318 {
326 pdump_entry_list_elmt *e; 319 pdump_entry_list_elt *e;
327 int align;
328 int pos = pdump_make_hash (obj); 320 int pos = pdump_make_hash (obj);
329 321
330 while ((e = pdump_hash[pos]) != 0) 322 while ((e = pdump_hash[pos]) != 0)
331 { 323 {
332 if (e->obj == obj) 324 if (e->obj == obj)
335 pos++; 327 pos++;
336 if (pos == PDUMP_HASHSIZE) 328 if (pos == PDUMP_HASHSIZE)
337 pos = 0; 329 pos = 0;
338 } 330 }
339 331
340 e = xnew (pdump_entry_list_elmt); 332 e = xnew (pdump_entry_list_elt);
341 333
342 e->next = list->first; 334 e->next = list->first;
343 e->obj = obj; 335 e->obj = obj;
344 e->size = size; 336 e->size = size;
345 e->count = count; 337 e->count = count;
346 list->first = e; 338 list->first = e;
347 339
348 list->count += count; 340 list->count += count;
349 pdump_hash[pos] = e; 341 pdump_hash[pos] = e;
350 342
351 align = pdump_align_table[size & 255]; 343 {
352 344 int align = pdump_size_to_align (size);
353 if (align < list->align) 345
354 list->align = align; 346 if (align < list->align)
347 list->align = align;
348 }
355 } 349 }
356 350
357 static pdump_entry_list * 351 static pdump_entry_list *
358 pdump_get_entry_list (const struct struct_description *sdesc) 352 pdump_get_entry_list (const struct struct_description *sdesc)
359 { 353 {
366 { 360 {
367 if (pdump_struct_table.size == -1) 361 if (pdump_struct_table.size == -1)
368 pdump_struct_table.size = 10; 362 pdump_struct_table.size = 10;
369 else 363 else
370 pdump_struct_table.size = pdump_struct_table.size * 2; 364 pdump_struct_table.size = pdump_struct_table.size * 2;
371 pdump_struct_table.list = (pdump_struct_list_elmt *) 365 pdump_struct_table.list = (pdump_struct_list_elt *)
372 xrealloc (pdump_struct_table.list, 366 xrealloc (pdump_struct_table.list,
373 pdump_struct_table.size * sizeof (pdump_struct_list_elmt)); 367 pdump_struct_table.size * sizeof (pdump_struct_list_elt));
374 } 368 }
375 pdump_struct_table.list[pdump_struct_table.count].list.first = 0; 369 pdump_struct_table.list[pdump_struct_table.count].list.first = 0;
376 pdump_struct_table.list[pdump_struct_table.count].list.align = 8; 370 pdump_struct_table.list[pdump_struct_table.count].list.align = ALIGNOF (max_align_t);
377 pdump_struct_table.list[pdump_struct_table.count].list.count = 0; 371 pdump_struct_table.list[pdump_struct_table.count].list.count = 0;
378 pdump_struct_table.list[pdump_struct_table.count].sdesc = sdesc; 372 pdump_struct_table.list[pdump_struct_table.count].sdesc = sdesc;
379 373
380 return &pdump_struct_table.list[pdump_struct_table.count++].list; 374 return &pdump_struct_table.list[pdump_struct_table.count++].list;
381 } 375 }
626 --depth; 620 --depth;
627 } 621 }
628 } 622 }
629 623
630 static void 624 static void
631 pdump_dump_data (pdump_entry_list_elmt *elmt, 625 pdump_dump_data (pdump_entry_list_elt *elt,
632 const struct lrecord_description *desc) 626 const struct lrecord_description *desc)
633 { 627 {
634 size_t size = elmt->size; 628 size_t size = elt->size;
635 int count = elmt->count; 629 int count = elt->count;
636 if (desc) 630 if (desc)
637 { 631 {
638 int pos, i; 632 int pos, i;
639 memcpy (pdump_buf, elmt->obj, size*count); 633 memcpy (pdump_buf, elt->obj, size*count);
640 634
641 for (i=0; i<count; i++) 635 for (i=0; i<count; i++)
642 { 636 {
643 char *cur = ((char *)pdump_buf) + i*size; 637 char *cur = ((char *)pdump_buf) + i*size;
644 restart: 638 restart:
646 { 640 {
647 void *rdata = cur + desc[pos].offset; 641 void *rdata = cur + desc[pos].offset;
648 switch (desc[pos].type) 642 switch (desc[pos].type)
649 { 643 {
650 case XD_SPECIFIER_END: 644 case XD_SPECIFIER_END:
651 desc = ((const Lisp_Specifier *)(elmt->obj))->methods->extra_description; 645 desc = ((const Lisp_Specifier *)(elt->obj))->methods->extra_description;
652 goto restart; 646 goto restart;
653 case XD_SIZE_T: 647 case XD_SIZE_T:
654 case XD_INT: 648 case XD_INT:
655 case XD_LONG: 649 case XD_LONG:
656 case XD_BYTECOUNT: 650 case XD_BYTECOUNT:
657 break; 651 break;
658 case XD_INT_RESET: 652 case XD_INT_RESET:
659 { 653 {
660 EMACS_INT val = desc[pos].data1; 654 EMACS_INT val = desc[pos].data1;
661 if (XD_IS_INDIRECT (val)) 655 if (XD_IS_INDIRECT (val))
662 val = pdump_get_indirect_count (val, desc, elmt->obj); 656 val = pdump_get_indirect_count (val, desc, elt->obj);
663 *(int *)rdata = val; 657 *(int *)rdata = val;
664 break; 658 break;
665 } 659 }
666 case XD_OPAQUE_DATA_PTR: 660 case XD_OPAQUE_DATA_PTR:
667 case XD_C_STRING: 661 case XD_C_STRING:
673 break; 667 break;
674 } 668 }
675 case XD_LO_LINK: 669 case XD_LO_LINK:
676 { 670 {
677 Lisp_Object obj = *(Lisp_Object *)rdata; 671 Lisp_Object obj = *(Lisp_Object *)rdata;
678 pdump_entry_list_elmt *elmt1; 672 pdump_entry_list_elt *elt1;
679 for (;;) 673 for (;;)
680 { 674 {
681 elmt1 = pdump_get_entry (XRECORD_LHEADER (obj)); 675 elt1 = pdump_get_entry (XRECORD_LHEADER (obj));
682 if (elmt1) 676 if (elt1)
683 break; 677 break;
684 obj = *(Lisp_Object *)(desc[pos].offset + (char *)(XRECORD_LHEADER (obj))); 678 obj = *(Lisp_Object *)(desc[pos].offset + (char *)(XRECORD_LHEADER (obj)));
685 } 679 }
686 *(EMACS_INT *)rdata = elmt1->save_offset; 680 *(EMACS_INT *)rdata = elt1->save_offset;
687 break; 681 break;
688 } 682 }
689 case XD_LISP_OBJECT: 683 case XD_LISP_OBJECT:
690 { 684 {
691 Lisp_Object *pobj = (Lisp_Object *) rdata; 685 Lisp_Object *pobj = (Lisp_Object *) rdata;
700 case XD_LISP_OBJECT_ARRAY: 694 case XD_LISP_OBJECT_ARRAY:
701 { 695 {
702 EMACS_INT num = desc[pos].data1; 696 EMACS_INT num = desc[pos].data1;
703 int j; 697 int j;
704 if (XD_IS_INDIRECT (num)) 698 if (XD_IS_INDIRECT (num))
705 num = pdump_get_indirect_count (num, desc, elmt->obj); 699 num = pdump_get_indirect_count (num, desc, elt->obj);
706 700
707 for (j=0; j<num; j++) 701 for (j=0; j<num; j++)
708 { 702 {
709 Lisp_Object *pobj = ((Lisp_Object *)rdata) + j; 703 Lisp_Object *pobj = ((Lisp_Object *)rdata) + j;
710 if (POINTER_TYPE_P (XTYPE (*pobj)) && XRECORD_LHEADER (*pobj)) 704 if (POINTER_TYPE_P (XTYPE (*pobj)) && XRECORD_LHEADER (*pobj))
725 abort (); 719 abort ();
726 } 720 }
727 } 721 }
728 } 722 }
729 } 723 }
730 fwrite (desc ? pdump_buf : elmt->obj, size, count, pdump_out); 724 fwrite (desc ? pdump_buf : elt->obj, size, count, pdump_out);
731 } 725 }
732 726
733 static void 727 static void
734 pdump_reloc_one (void *data, EMACS_INT delta, 728 pdump_reloc_one (void *data, EMACS_INT delta,
735 const struct lrecord_description *desc) 729 const struct lrecord_description *desc)
804 }; 798 };
805 } 799 }
806 } 800 }
807 801
808 static void 802 static void
809 pdump_allocate_offset (pdump_entry_list_elmt *elmt, 803 pdump_allocate_offset (pdump_entry_list_elt *elt,
810 const struct lrecord_description *desc) 804 const struct lrecord_description *desc)
811 { 805 {
812 size_t size = elmt->count * elmt->size; 806 size_t size = elt->count * elt->size;
813 elmt->save_offset = cur_offset; 807 elt->save_offset = cur_offset;
814 if (size>max_size) 808 if (size>max_size)
815 max_size = size; 809 max_size = size;
816 cur_offset += size; 810 cur_offset += size;
817 } 811 }
818 812
819 static void 813 static void
820 pdump_scan_by_alignment (void (*f)(pdump_entry_list_elmt *, 814 pdump_scan_by_alignment (void (*f)(pdump_entry_list_elt *,
821 const struct lrecord_description *)) 815 const struct lrecord_description *))
822 { 816 {
823 int align, i; 817 int align;
824 const struct lrecord_description *idesc; 818
825 pdump_entry_list_elmt *elmt; 819 for (align = ALIGNOF (max_align_t); align; align>>=1)
826 for (align=8; align>=0; align--) 820 {
827 { 821 int i;
822 pdump_entry_list_elt *elt;
823
828 for (i=0; i<lrecord_type_count; i++) 824 for (i=0; i<lrecord_type_count; i++)
829 if (pdump_object_table[i].align == align) 825 if (pdump_object_table[i].align == align)
830 { 826 for (elt = pdump_object_table[i].first; elt; elt = elt->next)
831 elmt = pdump_object_table[i].first; 827 f (elt, lrecord_implementations_table[i]->description);
832 if (!elmt)
833 continue;
834 idesc = lrecord_implementations_table[i]->description;
835 while (elmt)
836 {
837 f (elmt, idesc);
838 elmt = elmt->next;
839 }
840 }
841 828
842 for (i=0; i<pdump_struct_table.count; i++) 829 for (i=0; i<pdump_struct_table.count; i++)
843 if (pdump_struct_table.list[i].list.align == align) 830 {
844 { 831 pdump_struct_list_elt list = pdump_struct_table.list[i];
845 elmt = pdump_struct_table.list[i].list.first; 832 if (list.list.align == align)
846 idesc = pdump_struct_table.list[i].sdesc->description; 833 for (elt = list.list.first; elt; elt = elt->next)
847 while (elmt) 834 f (elt, list.sdesc->description);
848 {
849 f (elmt, idesc);
850 elmt = elmt->next;
851 }
852 }
853
854 elmt = pdump_opaque_data_list.first;
855 while (elmt)
856 {
857 if (pdump_align_table[elmt->size & 255] == align)
858 f (elmt, 0);
859 elmt = elmt->next;
860 } 835 }
836
837 for (elt = pdump_opaque_data_list.first; elt; elt = elt->next)
838 if (pdump_size_to_align (elt->size) == align)
839 f (elt, 0);
861 } 840 }
862 } 841 }
863 842
864 static void 843 static void
865 pdump_dump_root_struct_ptrs (void) 844 pdump_dump_root_struct_ptrs (void)
890 869
891 static void 870 static void
892 pdump_dump_rtables (void) 871 pdump_dump_rtables (void)
893 { 872 {
894 int i; 873 int i;
895 pdump_entry_list_elmt *elmt; 874 pdump_entry_list_elt *elt;
896 pdump_reloc_table rt; 875 pdump_reloc_table rt;
897 876
898 for (i=0; i<lrecord_type_count; i++) 877 for (i=0; i<lrecord_type_count; i++)
899 { 878 {
900 elmt = pdump_object_table[i].first; 879 elt = pdump_object_table[i].first;
901 if (!elmt) 880 if (!elt)
902 continue; 881 continue;
903 rt.desc = lrecord_implementations_table[i]->description; 882 rt.desc = lrecord_implementations_table[i]->description;
904 rt.count = pdump_object_table[i].count; 883 rt.count = pdump_object_table[i].count;
905 PDUMP_WRITE_ALIGNED (pdump_reloc_table, rt); 884 PDUMP_WRITE_ALIGNED (pdump_reloc_table, rt);
906 while (elmt) 885 while (elt)
907 { 886 {
908 EMACS_INT rdata = pdump_get_entry (elmt->obj)->save_offset; 887 EMACS_INT rdata = pdump_get_entry (elt->obj)->save_offset;
909 PDUMP_WRITE_ALIGNED (EMACS_INT, rdata); 888 PDUMP_WRITE_ALIGNED (EMACS_INT, rdata);
910 elmt = elmt->next; 889 elt = elt->next;
911 } 890 }
912 } 891 }
913 892
914 rt.desc = 0; 893 rt.desc = 0;
915 rt.count = 0; 894 rt.count = 0;
916 PDUMP_WRITE_ALIGNED (pdump_reloc_table, rt); 895 PDUMP_WRITE_ALIGNED (pdump_reloc_table, rt);
917 896
918 for (i=0; i<pdump_struct_table.count; i++) 897 for (i=0; i<pdump_struct_table.count; i++)
919 { 898 {
920 elmt = pdump_struct_table.list[i].list.first; 899 elt = pdump_struct_table.list[i].list.first;
921 rt.desc = pdump_struct_table.list[i].sdesc->description; 900 rt.desc = pdump_struct_table.list[i].sdesc->description;
922 rt.count = pdump_struct_table.list[i].list.count; 901 rt.count = pdump_struct_table.list[i].list.count;
923 PDUMP_WRITE_ALIGNED (pdump_reloc_table, rt); 902 PDUMP_WRITE_ALIGNED (pdump_reloc_table, rt);
924 while (elmt) 903 while (elt)
925 { 904 {
926 EMACS_INT rdata = pdump_get_entry (elmt->obj)->save_offset; 905 EMACS_INT rdata = pdump_get_entry (elt->obj)->save_offset;
927 int j; 906 int j;
928 for (j=0; j<elmt->count; j++) 907 for (j=0; j<elt->count; j++)
929 { 908 {
930 PDUMP_WRITE_ALIGNED (EMACS_INT, rdata); 909 PDUMP_WRITE_ALIGNED (EMACS_INT, rdata);
931 rdata += elmt->size; 910 rdata += elt->size;
932 } 911 }
933 elmt = elmt->next; 912 elt = elt->next;
934 } 913 }
935 } 914 }
936 rt.desc = 0; 915 rt.desc = 0;
937 rt.count = 0; 916 rt.count = 0;
938 PDUMP_WRITE_ALIGNED (pdump_reloc_table, rt); 917 PDUMP_WRITE_ALIGNED (pdump_reloc_table, rt);
951 for (i=0; i<Dynarr_length (pdump_root_objects); i++) 930 for (i=0; i<Dynarr_length (pdump_root_objects); i++)
952 { 931 {
953 pdump_static_Lisp_Object obj; 932 pdump_static_Lisp_Object obj;
954 obj.address = Dynarr_at (pdump_root_objects, i); 933 obj.address = Dynarr_at (pdump_root_objects, i);
955 obj.value = * obj.address; 934 obj.value = * obj.address;
956 935
957 if (POINTER_TYPE_P (XTYPE (obj.value))) 936 if (POINTER_TYPE_P (XTYPE (obj.value)))
958 obj.value = wrap_object ((void *) pdump_get_entry (XRECORD_LHEADER (obj.value))->save_offset); 937 obj.value = wrap_object ((void *) pdump_get_entry (XRECORD_LHEADER (obj.value))->save_offset);
959 938
960 PDUMP_WRITE (pdump_static_Lisp_Object, obj); 939 PDUMP_WRITE (pdump_static_Lisp_Object, obj);
961 } 940 }
962 941
963 for (i=0; i<Dynarr_length (pdump_weak_object_chains); i++) 942 for (i=0; i<Dynarr_length (pdump_weak_object_chains); i++)
964 { 943 {
965 pdump_entry_list_elmt *elmt; 944 pdump_entry_list_elt *elt;
966 pdump_static_Lisp_Object obj; 945 pdump_static_Lisp_Object obj;
967 946
968 obj.address = Dynarr_at (pdump_weak_object_chains, i); 947 obj.address = Dynarr_at (pdump_weak_object_chains, i);
969 obj.value = * obj.address; 948 obj.value = * obj.address;
970 949
971 for (;;) 950 for (;;)
972 { 951 {
973 const struct lrecord_description *desc; 952 const struct lrecord_description *desc;
974 int pos; 953 int pos;
975 elmt = pdump_get_entry (XRECORD_LHEADER (obj.value)); 954 elt = pdump_get_entry (XRECORD_LHEADER (obj.value));
976 if (elmt) 955 if (elt)
977 break; 956 break;
978 desc = XRECORD_LHEADER_IMPLEMENTATION (obj.value)->description; 957 desc = XRECORD_LHEADER_IMPLEMENTATION (obj.value)->description;
979 for (pos = 0; desc[pos].type != XD_LO_LINK; pos++) 958 for (pos = 0; desc[pos].type != XD_LO_LINK; pos++)
980 assert (desc[pos].type != XD_END); 959 assert (desc[pos].type != XD_END);
981 960
982 obj.value = *(Lisp_Object *)(desc[pos].offset + (char *)(XRECORD_LHEADER (obj.value))); 961 obj.value = *(Lisp_Object *)(desc[pos].offset + (char *)(XRECORD_LHEADER (obj.value)));
983 } 962 }
984 obj.value = wrap_object ((void *) elmt->save_offset); 963 obj.value = wrap_object ((void *) elt->save_offset);
985 964
986 PDUMP_WRITE (pdump_static_Lisp_Object, obj); 965 PDUMP_WRITE (pdump_static_Lisp_Object, obj);
987 } 966 }
988 } 967 }
989 968
993 int i; 972 int i;
994 Lisp_Object t_console, t_device, t_frame; 973 Lisp_Object t_console, t_device, t_frame;
995 int none; 974 int none;
996 pdump_header header; 975 pdump_header header;
997 976
977 pdump_object_table = xnew_array (pdump_entry_list, lrecord_type_count);
978 pdump_alert_undump_object = xnew_array (int, lrecord_type_count);
979
980 assert (ALIGNOF (max_align_t) <= pdump_align_table[0]);
981
982 for (i = 0; i < countof (pdump_align_table); i++)
983 if (pdump_align_table[i] > ALIGNOF (max_align_t))
984 pdump_align_table[i] = ALIGNOF (max_align_t);
985
998 flush_all_buffer_local_cache (); 986 flush_all_buffer_local_cache ();
999 987
1000 /* These appear in a DEFVAR_LISP, which does a staticpro() */ 988 /* These appear in a DEFVAR_LISP, which does a staticpro() */
1001 t_console = Vterminal_console; Vterminal_console = Qnil; 989 t_console = Vterminal_console; Vterminal_console = Qnil;
1002 t_frame = Vterminal_frame; Vterminal_frame = Qnil; 990 t_frame = Vterminal_frame; Vterminal_frame = Qnil;
1005 dump_add_opaque (&lrecord_implementations_table, 993 dump_add_opaque (&lrecord_implementations_table,
1006 lrecord_type_count * sizeof (lrecord_implementations_table[0])); 994 lrecord_type_count * sizeof (lrecord_implementations_table[0]));
1007 dump_add_opaque (&lrecord_markers, 995 dump_add_opaque (&lrecord_markers,
1008 lrecord_type_count * sizeof (lrecord_markers[0])); 996 lrecord_type_count * sizeof (lrecord_markers[0]));
1009 997
1010 pdump_hash = xnew_array_and_zero (pdump_entry_list_elmt *, PDUMP_HASHSIZE); 998 pdump_hash = xnew_array_and_zero (pdump_entry_list_elt *, PDUMP_HASHSIZE);
1011 999
1012 for (i=0; i<lrecord_type_count; i++) 1000 for (i=0; i<lrecord_type_count; i++)
1013 { 1001 {
1014 pdump_object_table[i].first = 0; 1002 pdump_object_table[i].first = 0;
1015 pdump_object_table[i].align = 8; 1003 pdump_object_table[i].align = ALIGNOF (max_align_t);
1016 pdump_object_table[i].count = 0; 1004 pdump_object_table[i].count = 0;
1017 pdump_alert_undump_object[i] = 0; 1005 pdump_alert_undump_object[i] = 0;
1018 } 1006 }
1019 pdump_struct_table.count = 0; 1007 pdump_struct_table.count = 0;
1020 pdump_struct_table.size = -1; 1008 pdump_struct_table.size = -1;
1021 1009
1022 pdump_opaque_data_list.first = 0; 1010 pdump_opaque_data_list.first = 0;
1023 pdump_opaque_data_list.align = 8; 1011 pdump_opaque_data_list.align = ALIGNOF (max_align_t);
1024 pdump_opaque_data_list.count = 0; 1012 pdump_opaque_data_list.count = 0;
1025 depth = 0; 1013 depth = 0;
1026 1014
1027 for (i=0; i<Dynarr_length (pdump_root_objects); i++) 1015 for (i=0; i<Dynarr_length (pdump_root_objects); i++)
1028 pdump_register_object (* Dynarr_at (pdump_root_objects, i)); 1016 pdump_register_object (* Dynarr_at (pdump_root_objects, i));
1277 return 1; 1265 return 1;
1278 } 1266 }
1279 1267
1280 #else /* !WIN32_NATIVE */ 1268 #else /* !WIN32_NATIVE */
1281 1269
1282 static void *pdump_mallocadr;
1283
1284 static void 1270 static void
1285 pdump_file_free (void) 1271 pdump_file_free (void)
1286 { 1272 {
1287 xfree (pdump_mallocadr); 1273 xfree (pdump_start);
1288 } 1274 }
1289 1275
1290 #ifdef HAVE_MMAP 1276 #ifdef HAVE_MMAP
1291 static void 1277 static void
1292 pdump_file_unmap (void) 1278 pdump_file_unmap (void)
1324 close (fd); 1310 close (fd);
1325 return 1; 1311 return 1;
1326 } 1312 }
1327 #endif /* HAVE_MMAP */ 1313 #endif /* HAVE_MMAP */
1328 1314
1329 pdump_mallocadr = xmalloc (pdump_length+255); 1315 pdump_start = xnew_array (char, pdump_length);
1330 pdump_free = pdump_file_free; 1316 pdump_free = pdump_file_free;
1331 pdump_start = (char *)((255 + (unsigned long)pdump_mallocadr) & ~255);
1332 read (fd, pdump_start, pdump_length); 1317 read (fd, pdump_start, pdump_length);
1333 1318
1334 close (fd); 1319 close (fd);
1335 return 1; 1320 return 1;
1336 } 1321 }
1338 1323
1339 1324
1340 static int 1325 static int
1341 pdump_file_try (char *exe_path) 1326 pdump_file_try (char *exe_path)
1342 { 1327 {
1343 char *w; 1328 char *w = exe_path + strlen (exe_path);
1344 1329
1345 w = exe_path + strlen (exe_path);
1346 do 1330 do
1347 { 1331 {
1348 sprintf (w, "-%s-%08x.dmp", EMACS_VERSION, dump_id); 1332 sprintf (w, "-%s-%08x.dmp", EMACS_VERSION, dump_id);
1349 if (pdump_file_get (exe_path)) 1333 if (pdump_file_get (exe_path))
1350 { 1334 {