2 * Garbage Collection common functions for scavenging, moving and sizing
3 * objects. These are for use with both GC (stop & copy GC) and GENCGC
7 * This software is part of the SBCL system. See the README file for
10 * This software is derived from the CMU CL system, which was
11 * written at Carnegie Mellon University and released into the
12 * public domain. The software is in the public domain and is
13 * provided with absolutely no warranty. See the COPYING and CREDITS
14 * files for more information.
18 * For a review of garbage collection techniques (e.g. generational
19 * GC) and terminology (e.g. "scavenging") see Paul R. Wilson,
20 * "Uniprocessor Garbage Collection Techniques". As of 20000618, this
21 * had been accepted for _ACM Computing Surveys_ and was available
22 * as a PostScript preprint through
23 * <http://www.cs.utexas.edu/users/oops/papers.html>
25 * <ftp://ftp.cs.utexas.edu/pub/garbage/bigsurv.ps>.
36 #include "interrupt.h"
41 #include "genesis/primitive-objects.h"
42 #include "genesis/static-symbols.h"
43 #include "gc-internal.h"
45 #ifdef LISP_FEATURE_SPARC
46 #define LONG_FLOAT_SIZE 4
48 #ifdef LISP_FEATURE_X86
49 #define LONG_FLOAT_SIZE 3
54 forwarding_pointer_p(lispobj *pointer) {
55 lispobj first_word=*pointer;
56 #ifdef LISP_FEATURE_GENCGC
57 return (first_word == 0x01);
59 return (is_lisp_pointer(first_word)
60 && new_space_p(first_word));
64 static inline lispobj *
65 forwarding_pointer_value(lispobj *pointer) {
66 #ifdef LISP_FEATURE_GENCGC
67 return (lispobj *) ((pointer_sized_uint_t) pointer[1]);
69 return (lispobj *) ((pointer_sized_uint_t) pointer[0]);
73 set_forwarding_pointer(lispobj * pointer, lispobj newspace_copy) {
74 #ifdef LISP_FEATURE_GENCGC
76 pointer[1]=newspace_copy;
78 pointer[0]=newspace_copy;
83 int (*scavtab[256])(lispobj *where, lispobj object);
84 lispobj (*transother[256])(lispobj object);
85 int (*sizetab[256])(lispobj *where);
86 struct weak_pointer *weak_pointers;
88 unsigned long bytes_consed_between_gcs = 12*1024*1024;
95 /* to copy a boxed object */
97 copy_object(lispobj object, int nwords)
102 gc_assert(is_lisp_pointer(object));
103 gc_assert(from_space_p(object));
104 gc_assert((nwords & 0x01) == 0);
106 /* Get tag of object. */
107 tag = lowtag_of(object);
109 /* Allocate space. */
110 new = gc_general_alloc(nwords*4,ALLOC_BOXED,ALLOC_QUICK);
112 /* Copy the object. */
113 memcpy(new,native_pointer(object),nwords*4);
114 return make_lispobj(new,tag);
117 static int scav_lose(lispobj *where, lispobj object); /* forward decl */
119 /* FIXME: Most calls end up going to some trouble to compute an
120 * 'n_words' value for this function. The system might be a little
121 * simpler if this function used an 'end' parameter instead. */
123 scavenge(lispobj *start, long n_words)
125 lispobj *end = start + n_words;
127 int n_words_scavenged;
128 for (object_ptr = start;
130 object_ptr += n_words_scavenged) {
132 lispobj object = *object_ptr;
133 #ifdef LISP_FEATURE_GENCGC
134 gc_assert(!forwarding_pointer_p(object_ptr));
136 if (is_lisp_pointer(object)) {
137 if (from_space_p(object)) {
138 /* It currently points to old space. Check for a
139 * forwarding pointer. */
140 lispobj *ptr = native_pointer(object);
141 if (forwarding_pointer_p(ptr)) {
142 /* Yes, there's a forwarding pointer. */
143 *object_ptr = LOW_WORD(forwarding_pointer_value(ptr));
144 n_words_scavenged = 1;
146 /* Scavenge that pointer. */
148 (scavtab[widetag_of(object)])(object_ptr, object);
151 /* It points somewhere other than oldspace. Leave it
153 n_words_scavenged = 1;
156 #ifndef LISP_FEATURE_GENCGC
157 /* this workaround is probably not necessary for gencgc; at least, the
158 * behaviour it describes has never been reported */
159 else if (n_words==1) {
160 /* there are some situations where an
161 other-immediate may end up in a descriptor
162 register. I'm not sure whether this is
163 supposed to happen, but if it does then we
164 don't want to (a) barf or (b) scavenge over the
165 data-block, because there isn't one. So, if
166 we're checking a single word and it's anything
167 other than a pointer, just hush it up */
168 int type=widetag_of(object);
171 if ((scavtab[type]==scav_lose) ||
172 (((scavtab[type])(start,object))>1)) {
173 fprintf(stderr,"warning: attempted to scavenge non-descriptor value %x at %p. If you can\nreproduce this warning, send a bug report (see manual page for details)\n",
178 else if ((object & 3) == 0) {
179 /* It's a fixnum: really easy.. */
180 n_words_scavenged = 1;
182 /* It's some sort of header object or another. */
184 (scavtab[widetag_of(object)])(object_ptr, object);
187 gc_assert(object_ptr == end);
190 static lispobj trans_fun_header(lispobj object); /* forward decls */
191 static lispobj trans_boxed(lispobj object);
194 scav_fun_pointer(lispobj *where, lispobj object)
196 lispobj *first_pointer;
199 gc_assert(is_lisp_pointer(object));
201 /* Object is a pointer into from_space - not a FP. */
202 first_pointer = (lispobj *) native_pointer(object);
204 /* must transport object -- object may point to either a function
205 * header, a closure function header, or to a closure header. */
207 switch (widetag_of(*first_pointer)) {
208 case SIMPLE_FUN_HEADER_WIDETAG:
209 copy = trans_fun_header(object);
212 copy = trans_boxed(object);
216 if (copy != object) {
217 /* Set forwarding pointer */
218 set_forwarding_pointer(first_pointer,copy);
221 gc_assert(is_lisp_pointer(copy));
222 gc_assert(!from_space_p(copy));
231 trans_code(struct code *code)
233 struct code *new_code;
234 lispobj first, l_code, l_new_code;
235 int nheader_words, ncode_words, nwords;
236 unsigned long displacement;
237 lispobj fheaderl, *prev_pointer;
239 /* if object has already been transported, just return pointer */
240 first = code->header;
241 if (forwarding_pointer_p((lispobj *)code)) {
243 printf("Was already transported\n");
245 return (struct code *) forwarding_pointer_value
246 ((lispobj *)((pointer_sized_uint_t) code));
249 gc_assert(widetag_of(first) == CODE_HEADER_WIDETAG);
251 /* prepare to transport the code vector */
252 l_code = (lispobj) LOW_WORD(code) | OTHER_POINTER_LOWTAG;
254 ncode_words = fixnum_value(code->code_size);
255 nheader_words = HeaderValue(code->header);
256 nwords = ncode_words + nheader_words;
257 nwords = CEILING(nwords, 2);
259 l_new_code = copy_object(l_code, nwords);
260 new_code = (struct code *) native_pointer(l_new_code);
262 #if defined(DEBUG_CODE_GC)
263 printf("Old code object at 0x%08x, new code object at 0x%08x.\n",
264 (unsigned long) code, (unsigned long) new_code);
265 printf("Code object is %d words long.\n", nwords);
268 #ifdef LISP_FEATURE_GENCGC
269 if (new_code == code)
273 displacement = l_new_code - l_code;
275 set_forwarding_pointer((lispobj *)code, l_new_code);
277 /* set forwarding pointers for all the function headers in the */
278 /* code object. also fix all self pointers */
280 fheaderl = code->entry_points;
281 prev_pointer = &new_code->entry_points;
283 while (fheaderl != NIL) {
284 struct simple_fun *fheaderp, *nfheaderp;
287 fheaderp = (struct simple_fun *) native_pointer(fheaderl);
288 gc_assert(widetag_of(fheaderp->header) == SIMPLE_FUN_HEADER_WIDETAG);
290 /* Calculate the new function pointer and the new */
291 /* function header. */
292 nfheaderl = fheaderl + displacement;
293 nfheaderp = (struct simple_fun *) native_pointer(nfheaderl);
296 printf("fheaderp->header (at %x) <- %x\n",
297 &(fheaderp->header) , nfheaderl);
299 set_forwarding_pointer((lispobj *)fheaderp, nfheaderl);
301 /* fix self pointer. */
303 #ifdef LISP_FEATURE_X86
304 FUN_RAW_ADDR_OFFSET +
308 *prev_pointer = nfheaderl;
310 fheaderl = fheaderp->next;
311 prev_pointer = &nfheaderp->next;
313 os_flush_icache((os_vm_address_t) (((int *)new_code) + nheader_words),
314 ncode_words * sizeof(int));
315 #ifdef LISP_FEATURE_GENCGC
316 gencgc_apply_code_fixups(code, new_code);
322 scav_code_header(lispobj *where, lispobj object)
325 int n_header_words, n_code_words, n_words;
326 lispobj entry_point; /* tagged pointer to entry point */
327 struct simple_fun *function_ptr; /* untagged pointer to entry point */
329 code = (struct code *) where;
330 n_code_words = fixnum_value(code->code_size);
331 n_header_words = HeaderValue(object);
332 n_words = n_code_words + n_header_words;
333 n_words = CEILING(n_words, 2);
335 /* Scavenge the boxed section of the code data block. */
336 scavenge(where + 1, n_header_words - 1);
338 /* Scavenge the boxed section of each function object in the
339 * code data block. */
340 for (entry_point = code->entry_points;
342 entry_point = function_ptr->next) {
344 gc_assert(is_lisp_pointer(entry_point));
346 function_ptr = (struct simple_fun *) native_pointer(entry_point);
347 gc_assert(widetag_of(function_ptr->header)==SIMPLE_FUN_HEADER_WIDETAG);
349 scavenge(&function_ptr->name, 1);
350 scavenge(&function_ptr->arglist, 1);
351 scavenge(&function_ptr->type, 1);
358 trans_code_header(lispobj object)
362 ncode = trans_code((struct code *) native_pointer(object));
363 return (lispobj) LOW_WORD(ncode) | OTHER_POINTER_LOWTAG;
368 size_code_header(lispobj *where)
371 int nheader_words, ncode_words, nwords;
373 code = (struct code *) where;
375 ncode_words = fixnum_value(code->code_size);
376 nheader_words = HeaderValue(code->header);
377 nwords = ncode_words + nheader_words;
378 nwords = CEILING(nwords, 2);
383 #ifndef LISP_FEATURE_X86
385 scav_return_pc_header(lispobj *where, lispobj object)
387 lose("attempted to scavenge a return PC header where=0x%08x object=0x%08x",
388 (unsigned long) where,
389 (unsigned long) object);
390 return 0; /* bogus return value to satisfy static type checking */
392 #endif /* LISP_FEATURE_X86 */
395 trans_return_pc_header(lispobj object)
397 struct simple_fun *return_pc;
398 unsigned long offset;
399 struct code *code, *ncode;
401 return_pc = (struct simple_fun *) native_pointer(object);
402 offset = HeaderValue(return_pc->header) * 4 ;
404 /* Transport the whole code object */
405 code = (struct code *) ((unsigned long) return_pc - offset);
406 ncode = trans_code(code);
408 return ((lispobj) LOW_WORD(ncode) + offset) | OTHER_POINTER_LOWTAG;
411 /* On the 386, closures hold a pointer to the raw address instead of the
412 * function object, so we can use CALL [$FDEFN+const] to invoke
413 * the function without loading it into a register. Given that code
414 * objects don't move, we don't need to update anything, but we do
415 * have to figure out that the function is still live. */
417 #ifdef LISP_FEATURE_X86
419 scav_closure_header(lispobj *where, lispobj object)
421 struct closure *closure;
424 closure = (struct closure *)where;
425 fun = closure->fun - FUN_RAW_ADDR_OFFSET;
427 #ifdef LISP_FEATURE_GENCGC
428 /* The function may have moved so update the raw address. But
429 * don't write unnecessarily. */
430 if (closure->fun != fun + FUN_RAW_ADDR_OFFSET)
431 closure->fun = fun + FUN_RAW_ADDR_OFFSET;
437 #ifndef LISP_FEATURE_X86
439 scav_fun_header(lispobj *where, lispobj object)
441 lose("attempted to scavenge a function header where=0x%08x object=0x%08x",
442 (unsigned long) where,
443 (unsigned long) object);
444 return 0; /* bogus return value to satisfy static type checking */
446 #endif /* LISP_FEATURE_X86 */
449 trans_fun_header(lispobj object)
451 struct simple_fun *fheader;
452 unsigned long offset;
453 struct code *code, *ncode;
455 fheader = (struct simple_fun *) native_pointer(object);
456 offset = HeaderValue(fheader->header) * 4;
458 /* Transport the whole code object */
459 code = (struct code *) ((unsigned long) fheader - offset);
460 ncode = trans_code(code);
462 return ((lispobj) LOW_WORD(ncode) + offset) | FUN_POINTER_LOWTAG;
471 scav_instance_pointer(lispobj *where, lispobj object)
473 lispobj copy, *first_pointer;
475 /* Object is a pointer into from space - not a FP. */
476 copy = trans_boxed(object);
478 #ifdef LISP_FEATURE_GENCGC
479 gc_assert(copy != object);
482 first_pointer = (lispobj *) native_pointer(object);
483 set_forwarding_pointer(first_pointer,copy);
494 static lispobj trans_list(lispobj object);
497 scav_list_pointer(lispobj *where, lispobj object)
499 lispobj first, *first_pointer;
501 gc_assert(is_lisp_pointer(object));
503 /* Object is a pointer into from space - not FP. */
504 first_pointer = (lispobj *) native_pointer(object);
506 first = trans_list(object);
507 gc_assert(first != object);
509 /* Set forwarding pointer */
510 set_forwarding_pointer(first_pointer, first);
512 gc_assert(is_lisp_pointer(first));
513 gc_assert(!from_space_p(first));
521 trans_list(lispobj object)
523 lispobj new_list_pointer;
524 struct cons *cons, *new_cons;
527 cons = (struct cons *) native_pointer(object);
530 new_cons = (struct cons *)
531 gc_general_alloc(sizeof(struct cons),ALLOC_BOXED,ALLOC_QUICK);
532 new_cons->car = cons->car;
533 new_cons->cdr = cons->cdr; /* updated later */
534 new_list_pointer = make_lispobj(new_cons,lowtag_of(object));
536 /* Grab the cdr: set_forwarding_pointer will clobber it in GENCGC */
539 set_forwarding_pointer((lispobj *)cons, new_list_pointer);
541 /* Try to linearize the list in the cdr direction to help reduce
545 struct cons *cdr_cons, *new_cdr_cons;
547 if(lowtag_of(cdr) != LIST_POINTER_LOWTAG ||
548 !from_space_p(cdr) ||
549 forwarding_pointer_p((lispobj *)native_pointer(cdr)))
552 cdr_cons = (struct cons *) native_pointer(cdr);
555 new_cdr_cons = (struct cons*)
556 gc_general_alloc(sizeof(struct cons),ALLOC_BOXED,ALLOC_QUICK);
557 new_cdr_cons->car = cdr_cons->car;
558 new_cdr_cons->cdr = cdr_cons->cdr;
559 new_cdr = make_lispobj(new_cdr_cons, lowtag_of(cdr));
561 /* Grab the cdr before it is clobbered. */
563 set_forwarding_pointer((lispobj *)cdr_cons, new_cdr);
565 /* Update the cdr of the last cons copied into new space to
566 * keep the newspace scavenge from having to do it. */
567 new_cons->cdr = new_cdr;
569 new_cons = new_cdr_cons;
572 return new_list_pointer;
577 * scavenging and transporting other pointers
581 scav_other_pointer(lispobj *where, lispobj object)
583 lispobj first, *first_pointer;
585 gc_assert(is_lisp_pointer(object));
587 /* Object is a pointer into from space - not FP. */
588 first_pointer = (lispobj *) native_pointer(object);
589 first = (transother[widetag_of(*first_pointer)])(object);
591 if (first != object) {
592 set_forwarding_pointer(first_pointer, first);
593 #ifdef LISP_FEATURE_GENCGC
597 #ifndef LISP_FEATURE_GENCGC
600 gc_assert(is_lisp_pointer(first));
601 gc_assert(!from_space_p(first));
607 * immediate, boxed, and unboxed objects
611 size_pointer(lispobj *where)
617 scav_immediate(lispobj *where, lispobj object)
623 trans_immediate(lispobj object)
625 lose("trying to transport an immediate");
626 return NIL; /* bogus return value to satisfy static type checking */
630 size_immediate(lispobj *where)
637 scav_boxed(lispobj *where, lispobj object)
643 trans_boxed(lispobj object)
646 unsigned long length;
648 gc_assert(is_lisp_pointer(object));
650 header = *((lispobj *) native_pointer(object));
651 length = HeaderValue(header) + 1;
652 length = CEILING(length, 2);
654 return copy_object(object, length);
659 size_boxed(lispobj *where)
662 unsigned long length;
665 length = HeaderValue(header) + 1;
666 length = CEILING(length, 2);
671 /* Note: on the sparc we don't have to do anything special for fdefns, */
672 /* 'cause the raw-addr has a function lowtag. */
673 #ifndef LISP_FEATURE_SPARC
675 scav_fdefn(lispobj *where, lispobj object)
679 fdefn = (struct fdefn *)where;
681 /* FSHOW((stderr, "scav_fdefn, function = %p, raw_addr = %p\n",
682 fdefn->fun, fdefn->raw_addr)); */
684 if ((char *)(fdefn->fun + FUN_RAW_ADDR_OFFSET)
685 == (char *)((unsigned long)(fdefn->raw_addr))) {
686 scavenge(where + 1, sizeof(struct fdefn)/sizeof(lispobj) - 1);
688 /* Don't write unnecessarily. */
689 if (fdefn->raw_addr != (char *)(fdefn->fun + FUN_RAW_ADDR_OFFSET))
690 fdefn->raw_addr = (char *)(fdefn->fun + FUN_RAW_ADDR_OFFSET);
691 /* gc.c has more casts here, which may be relevant or alternatively
692 may be compiler warning defeaters. try
694 (u32) ((char *) LOW_WORD(fdefn->fun)) + FUN_RAW_ADDR_OFFSET;
696 return sizeof(struct fdefn) / sizeof(lispobj);
704 scav_unboxed(lispobj *where, lispobj object)
706 unsigned long length;
708 length = HeaderValue(object) + 1;
709 length = CEILING(length, 2);
715 trans_unboxed(lispobj object)
718 unsigned long length;
721 gc_assert(is_lisp_pointer(object));
723 header = *((lispobj *) native_pointer(object));
724 length = HeaderValue(header) + 1;
725 length = CEILING(length, 2);
727 return copy_unboxed_object(object, length);
731 size_unboxed(lispobj *where)
734 unsigned long length;
737 length = HeaderValue(header) + 1;
738 length = CEILING(length, 2);
744 /* vector-like objects */
746 scav_base_string(lispobj *where, lispobj object)
748 struct vector *vector;
751 /* NOTE: Strings contain one more byte of data than the length */
752 /* slot indicates. */
754 vector = (struct vector *) where;
755 length = fixnum_value(vector->length) + 1;
756 nwords = CEILING(NWORDS(length, 8) + 2, 2);
761 trans_base_string(lispobj object)
763 struct vector *vector;
766 gc_assert(is_lisp_pointer(object));
768 /* NOTE: A string contains one more byte of data (a terminating
769 * '\0' to help when interfacing with C functions) than indicated
770 * by the length slot. */
772 vector = (struct vector *) native_pointer(object);
773 length = fixnum_value(vector->length) + 1;
774 nwords = CEILING(NWORDS(length, 8) + 2, 2);
776 return copy_large_unboxed_object(object, nwords);
780 size_base_string(lispobj *where)
782 struct vector *vector;
785 /* NOTE: A string contains one more byte of data (a terminating
786 * '\0' to help when interfacing with C functions) than indicated
787 * by the length slot. */
789 vector = (struct vector *) where;
790 length = fixnum_value(vector->length) + 1;
791 nwords = CEILING(NWORDS(length, 8) + 2, 2);
797 trans_vector(lispobj object)
799 struct vector *vector;
802 gc_assert(is_lisp_pointer(object));
804 vector = (struct vector *) native_pointer(object);
806 length = fixnum_value(vector->length);
807 nwords = CEILING(length + 2, 2);
809 return copy_large_object(object, nwords);
813 size_vector(lispobj *where)
815 struct vector *vector;
818 vector = (struct vector *) where;
819 length = fixnum_value(vector->length);
820 nwords = CEILING(length + 2, 2);
826 scav_vector_nil(lispobj *where, lispobj object)
832 trans_vector_nil(lispobj object)
834 gc_assert(is_lisp_pointer(object));
835 return copy_unboxed_object(object, 2);
839 size_vector_nil(lispobj *where)
841 /* Just the header word and the length word */
846 scav_vector_bit(lispobj *where, lispobj object)
848 struct vector *vector;
851 vector = (struct vector *) where;
852 length = fixnum_value(vector->length);
853 nwords = CEILING(NWORDS(length, 1) + 2, 2);
859 trans_vector_bit(lispobj object)
861 struct vector *vector;
864 gc_assert(is_lisp_pointer(object));
866 vector = (struct vector *) native_pointer(object);
867 length = fixnum_value(vector->length);
868 nwords = CEILING(NWORDS(length, 1) + 2, 2);
870 return copy_large_unboxed_object(object, nwords);
874 size_vector_bit(lispobj *where)
876 struct vector *vector;
879 vector = (struct vector *) where;
880 length = fixnum_value(vector->length);
881 nwords = CEILING(NWORDS(length, 1) + 2, 2);
887 scav_vector_unsigned_byte_2(lispobj *where, lispobj object)
889 struct vector *vector;
892 vector = (struct vector *) where;
893 length = fixnum_value(vector->length);
894 nwords = CEILING(NWORDS(length, 2) + 2, 2);
900 trans_vector_unsigned_byte_2(lispobj object)
902 struct vector *vector;
905 gc_assert(is_lisp_pointer(object));
907 vector = (struct vector *) native_pointer(object);
908 length = fixnum_value(vector->length);
909 nwords = CEILING(NWORDS(length, 2) + 2, 2);
911 return copy_large_unboxed_object(object, nwords);
915 size_vector_unsigned_byte_2(lispobj *where)
917 struct vector *vector;
920 vector = (struct vector *) where;
921 length = fixnum_value(vector->length);
922 nwords = CEILING(NWORDS(length, 2) + 2, 2);
928 scav_vector_unsigned_byte_4(lispobj *where, lispobj object)
930 struct vector *vector;
933 vector = (struct vector *) where;
934 length = fixnum_value(vector->length);
935 nwords = CEILING(NWORDS(length, 4) + 2, 2);
941 trans_vector_unsigned_byte_4(lispobj object)
943 struct vector *vector;
946 gc_assert(is_lisp_pointer(object));
948 vector = (struct vector *) native_pointer(object);
949 length = fixnum_value(vector->length);
950 nwords = CEILING(NWORDS(length, 4) + 2, 2);
952 return copy_large_unboxed_object(object, nwords);
955 size_vector_unsigned_byte_4(lispobj *where)
957 struct vector *vector;
960 vector = (struct vector *) where;
961 length = fixnum_value(vector->length);
962 nwords = CEILING(NWORDS(length, 4) + 2, 2);
969 scav_vector_unsigned_byte_8(lispobj *where, lispobj object)
971 struct vector *vector;
974 vector = (struct vector *) where;
975 length = fixnum_value(vector->length);
976 nwords = CEILING(NWORDS(length, 8) + 2, 2);
981 /*********************/
986 trans_vector_unsigned_byte_8(lispobj object)
988 struct vector *vector;
991 gc_assert(is_lisp_pointer(object));
993 vector = (struct vector *) native_pointer(object);
994 length = fixnum_value(vector->length);
995 nwords = CEILING(NWORDS(length, 8) + 2, 2);
997 return copy_large_unboxed_object(object, nwords);
1001 size_vector_unsigned_byte_8(lispobj *where)
1003 struct vector *vector;
1006 vector = (struct vector *) where;
1007 length = fixnum_value(vector->length);
1008 nwords = CEILING(NWORDS(length, 8) + 2, 2);
1015 scav_vector_unsigned_byte_16(lispobj *where, lispobj object)
1017 struct vector *vector;
1020 vector = (struct vector *) where;
1021 length = fixnum_value(vector->length);
1022 nwords = CEILING(NWORDS(length, 16) + 2, 2);
1028 trans_vector_unsigned_byte_16(lispobj object)
1030 struct vector *vector;
1033 gc_assert(is_lisp_pointer(object));
1035 vector = (struct vector *) native_pointer(object);
1036 length = fixnum_value(vector->length);
1037 nwords = CEILING(NWORDS(length, 16) + 2, 2);
1039 return copy_large_unboxed_object(object, nwords);
1043 size_vector_unsigned_byte_16(lispobj *where)
1045 struct vector *vector;
1048 vector = (struct vector *) where;
1049 length = fixnum_value(vector->length);
1050 nwords = CEILING(NWORDS(length, 16) + 2, 2);
1056 scav_vector_unsigned_byte_32(lispobj *where, lispobj object)
1058 struct vector *vector;
1061 vector = (struct vector *) where;
1062 length = fixnum_value(vector->length);
1063 nwords = CEILING(NWORDS(length, 32) + 2, 2);
1069 trans_vector_unsigned_byte_32(lispobj object)
1071 struct vector *vector;
1074 gc_assert(is_lisp_pointer(object));
1076 vector = (struct vector *) native_pointer(object);
1077 length = fixnum_value(vector->length);
1078 nwords = CEILING(NWORDS(length, 32) + 2, 2);
1080 return copy_large_unboxed_object(object, nwords);
1084 size_vector_unsigned_byte_32(lispobj *where)
1086 struct vector *vector;
1089 vector = (struct vector *) where;
1090 length = fixnum_value(vector->length);
1091 nwords = CEILING(NWORDS(length, 32) + 2, 2);
1096 #if N_WORD_BITS == 64
1098 scav_vector_unsigned_byte_64(lispobj *where, lispobj object)
1100 struct vector *vector;
1103 vector = (struct vector *) where;
1104 length = fixnum_value(vector->length);
1105 nwords = CEILING(NWORDS(length, 64) + 2, 2);
1111 trans_vector_unsigned_byte_64(lispobj object)
1113 struct vector *vector;
1116 gc_assert(is_lisp_pointer(object));
1118 vector = (struct vector *) native_pointer(object);
1119 length = fixnum_value(vector->length);
1120 nwords = CEILING(NWORDS(length, 64) + 2, 2);
1122 return copy_large_unboxed_object(object, nwords);
1126 size_vector_unsigned_byte_64(lispobj *where)
1128 struct vector *vector;
1131 vector = (struct vector *) where;
1132 length = fixnum_value(vector->length);
1133 nwords = CEILING(NWORDS(length, 64) + 2, 2);
1140 scav_vector_single_float(lispobj *where, lispobj object)
1142 struct vector *vector;
1145 vector = (struct vector *) where;
1146 length = fixnum_value(vector->length);
1147 nwords = CEILING(length + 2, 2);
1153 trans_vector_single_float(lispobj object)
1155 struct vector *vector;
1158 gc_assert(is_lisp_pointer(object));
1160 vector = (struct vector *) native_pointer(object);
1161 length = fixnum_value(vector->length);
1162 nwords = CEILING(length + 2, 2);
1164 return copy_large_unboxed_object(object, nwords);
1168 size_vector_single_float(lispobj *where)
1170 struct vector *vector;
1173 vector = (struct vector *) where;
1174 length = fixnum_value(vector->length);
1175 nwords = CEILING(length + 2, 2);
1181 scav_vector_double_float(lispobj *where, lispobj object)
1183 struct vector *vector;
1186 vector = (struct vector *) where;
1187 length = fixnum_value(vector->length);
1188 nwords = CEILING(length * 2 + 2, 2);
1194 trans_vector_double_float(lispobj object)
1196 struct vector *vector;
1199 gc_assert(is_lisp_pointer(object));
1201 vector = (struct vector *) native_pointer(object);
1202 length = fixnum_value(vector->length);
1203 nwords = CEILING(length * 2 + 2, 2);
1205 return copy_large_unboxed_object(object, nwords);
1209 size_vector_double_float(lispobj *where)
1211 struct vector *vector;
1214 vector = (struct vector *) where;
1215 length = fixnum_value(vector->length);
1216 nwords = CEILING(length * 2 + 2, 2);
1221 #ifdef SIMPLE_ARRAY_LONG_FLOAT_WIDETAG
1223 scav_vector_long_float(lispobj *where, lispobj object)
1225 struct vector *vector;
1228 vector = (struct vector *) where;
1229 length = fixnum_value(vector->length);
1230 nwords = CEILING(length *
1237 trans_vector_long_float(lispobj object)
1239 struct vector *vector;
1242 gc_assert(is_lisp_pointer(object));
1244 vector = (struct vector *) native_pointer(object);
1245 length = fixnum_value(vector->length);
1246 nwords = CEILING(length * LONG_FLOAT_SIZE + 2, 2);
1248 return copy_large_unboxed_object(object, nwords);
1252 size_vector_long_float(lispobj *where)
1254 struct vector *vector;
1257 vector = (struct vector *) where;
1258 length = fixnum_value(vector->length);
1259 nwords = CEILING(length * LONG_FLOAT_SIZE + 2, 2);
1266 #ifdef SIMPLE_ARRAY_COMPLEX_SINGLE_FLOAT_WIDETAG
1268 scav_vector_complex_single_float(lispobj *where, lispobj object)
1270 struct vector *vector;
1273 vector = (struct vector *) where;
1274 length = fixnum_value(vector->length);
1275 nwords = CEILING(length * 2 + 2, 2);
1281 trans_vector_complex_single_float(lispobj object)
1283 struct vector *vector;
1286 gc_assert(is_lisp_pointer(object));
1288 vector = (struct vector *) native_pointer(object);
1289 length = fixnum_value(vector->length);
1290 nwords = CEILING(length * 2 + 2, 2);
1292 return copy_large_unboxed_object(object, nwords);
1296 size_vector_complex_single_float(lispobj *where)
1298 struct vector *vector;
1301 vector = (struct vector *) where;
1302 length = fixnum_value(vector->length);
1303 nwords = CEILING(length * 2 + 2, 2);
1309 #ifdef SIMPLE_ARRAY_COMPLEX_DOUBLE_FLOAT_WIDETAG
1311 scav_vector_complex_double_float(lispobj *where, lispobj object)
1313 struct vector *vector;
1316 vector = (struct vector *) where;
1317 length = fixnum_value(vector->length);
1318 nwords = CEILING(length * 4 + 2, 2);
1324 trans_vector_complex_double_float(lispobj object)
1326 struct vector *vector;
1329 gc_assert(is_lisp_pointer(object));
1331 vector = (struct vector *) native_pointer(object);
1332 length = fixnum_value(vector->length);
1333 nwords = CEILING(length * 4 + 2, 2);
1335 return copy_large_unboxed_object(object, nwords);
1339 size_vector_complex_double_float(lispobj *where)
1341 struct vector *vector;
1344 vector = (struct vector *) where;
1345 length = fixnum_value(vector->length);
1346 nwords = CEILING(length * 4 + 2, 2);
1353 #ifdef SIMPLE_ARRAY_COMPLEX_LONG_FLOAT_WIDETAG
1355 scav_vector_complex_long_float(lispobj *where, lispobj object)
1357 struct vector *vector;
1360 vector = (struct vector *) where;
1361 length = fixnum_value(vector->length);
1362 nwords = CEILING(length * (2* LONG_FLOAT_SIZE) + 2, 2);
1368 trans_vector_complex_long_float(lispobj object)
1370 struct vector *vector;
1373 gc_assert(is_lisp_pointer(object));
1375 vector = (struct vector *) native_pointer(object);
1376 length = fixnum_value(vector->length);
1377 nwords = CEILING(length * (2*LONG_FLOAT_SIZE) + 2, 2);
1379 return copy_large_unboxed_object(object, nwords);
1383 size_vector_complex_long_float(lispobj *where)
1385 struct vector *vector;
1388 vector = (struct vector *) where;
1389 length = fixnum_value(vector->length);
1390 nwords = CEILING(length * (2*LONG_FLOAT_SIZE) + 2, 2);
1396 #define WEAK_POINTER_NWORDS \
1397 CEILING((sizeof(struct weak_pointer) / sizeof(lispobj)), 2)
1400 trans_weak_pointer(lispobj object)
1403 #ifndef LISP_FEATURE_GENCGC
1404 struct weak_pointer *wp;
1406 gc_assert(is_lisp_pointer(object));
1408 #if defined(DEBUG_WEAK)
1409 printf("Transporting weak pointer from 0x%08x\n", object);
1412 /* Need to remember where all the weak pointers are that have */
1413 /* been transported so they can be fixed up in a post-GC pass. */
1415 copy = copy_object(object, WEAK_POINTER_NWORDS);
1416 #ifndef LISP_FEATURE_GENCGC
1417 wp = (struct weak_pointer *) native_pointer(copy);
1419 gc_assert(widetag_of(wp->header)==WEAK_POINTER_WIDETAG);
1420 /* Push the weak pointer onto the list of weak pointers. */
1421 wp->next = LOW_WORD(weak_pointers);
1428 size_weak_pointer(lispobj *where)
1430 return WEAK_POINTER_NWORDS;
1434 void scan_weak_pointers(void)
1436 struct weak_pointer *wp;
1437 for (wp = weak_pointers; wp != NULL;
1438 wp=(struct weak_pointer *)native_pointer(wp->next)) {
1439 lispobj value = wp->value;
1440 lispobj *first_pointer;
1441 gc_assert(widetag_of(wp->header)==WEAK_POINTER_WIDETAG);
1442 if (!(is_lisp_pointer(value) && from_space_p(value)))
1445 /* Now, we need to check whether the object has been forwarded. If
1446 * it has been, the weak pointer is still good and needs to be
1447 * updated. Otherwise, the weak pointer needs to be nil'ed
1450 first_pointer = (lispobj *)native_pointer(value);
1452 if (forwarding_pointer_p(first_pointer)) {
1454 (lispobj)LOW_WORD(forwarding_pointer_value(first_pointer));
1470 scav_lose(lispobj *where, lispobj object)
1472 lose("no scavenge function for object 0x%08x (widetag 0x%x)",
1473 (unsigned long)object,
1474 widetag_of(*(lispobj*)native_pointer(object)));
1475 return 0; /* bogus return value to satisfy static type checking */
1479 trans_lose(lispobj object)
1481 lose("no transport function for object 0x%08x (widetag 0x%x)",
1482 (unsigned long)object,
1483 widetag_of(*(lispobj*)native_pointer(object)));
1484 return NIL; /* bogus return value to satisfy static type checking */
1488 size_lose(lispobj *where)
1490 lose("no size function for object at 0x%08x (widetag 0x%x)",
1491 (unsigned long)where,
1492 widetag_of(LOW_WORD(where)));
1493 return 1; /* bogus return value to satisfy static type checking */
1502 gc_init_tables(void)
1506 /* Set default value in all slots of scavenge table. FIXME
1507 * replace this gnarly sizeof with something based on
1509 for (i = 0; i < ((sizeof scavtab)/(sizeof scavtab[0])); i++) {
1510 scavtab[i] = scav_lose;
1513 /* For each type which can be selected by the lowtag alone, set
1514 * multiple entries in our widetag scavenge table (one for each
1515 * possible value of the high bits).
1518 for (i = 0; i < (1<<(N_WIDETAG_BITS-N_LOWTAG_BITS)); i++) {
1519 scavtab[EVEN_FIXNUM_LOWTAG|(i<<N_LOWTAG_BITS)] = scav_immediate;
1520 scavtab[FUN_POINTER_LOWTAG|(i<<N_LOWTAG_BITS)] = scav_fun_pointer;
1521 /* skipping OTHER_IMMEDIATE_0_LOWTAG */
1522 scavtab[LIST_POINTER_LOWTAG|(i<<N_LOWTAG_BITS)] = scav_list_pointer;
1523 scavtab[ODD_FIXNUM_LOWTAG|(i<<N_LOWTAG_BITS)] = scav_immediate;
1524 scavtab[INSTANCE_POINTER_LOWTAG|(i<<N_LOWTAG_BITS)] = scav_instance_pointer;
1525 /* skipping OTHER_IMMEDIATE_1_LOWTAG */
1526 scavtab[OTHER_POINTER_LOWTAG|(i<<N_LOWTAG_BITS)] = scav_other_pointer;
1529 /* Other-pointer types (those selected by all eight bits of the
1530 * tag) get one entry each in the scavenge table. */
1531 scavtab[BIGNUM_WIDETAG] = scav_unboxed;
1532 scavtab[RATIO_WIDETAG] = scav_boxed;
1533 scavtab[SINGLE_FLOAT_WIDETAG] = scav_unboxed;
1534 scavtab[DOUBLE_FLOAT_WIDETAG] = scav_unboxed;
1535 #ifdef LONG_FLOAT_WIDETAG
1536 scavtab[LONG_FLOAT_WIDETAG] = scav_unboxed;
1538 scavtab[COMPLEX_WIDETAG] = scav_boxed;
1539 #ifdef COMPLEX_SINGLE_FLOAT_WIDETAG
1540 scavtab[COMPLEX_SINGLE_FLOAT_WIDETAG] = scav_unboxed;
1542 #ifdef COMPLEX_DOUBLE_FLOAT_WIDETAG
1543 scavtab[COMPLEX_DOUBLE_FLOAT_WIDETAG] = scav_unboxed;
1545 #ifdef COMPLEX_LONG_FLOAT_WIDETAG
1546 scavtab[COMPLEX_LONG_FLOAT_WIDETAG] = scav_unboxed;
1548 scavtab[SIMPLE_ARRAY_WIDETAG] = scav_boxed;
1549 scavtab[SIMPLE_BASE_STRING_WIDETAG] = scav_base_string;
1550 scavtab[SIMPLE_BIT_VECTOR_WIDETAG] = scav_vector_bit;
1551 scavtab[SIMPLE_ARRAY_NIL_WIDETAG] = scav_vector_nil;
1552 scavtab[SIMPLE_ARRAY_UNSIGNED_BYTE_2_WIDETAG] =
1553 scav_vector_unsigned_byte_2;
1554 scavtab[SIMPLE_ARRAY_UNSIGNED_BYTE_4_WIDETAG] =
1555 scav_vector_unsigned_byte_4;
1556 scavtab[SIMPLE_ARRAY_UNSIGNED_BYTE_7_WIDETAG] =
1557 scav_vector_unsigned_byte_8;
1558 scavtab[SIMPLE_ARRAY_UNSIGNED_BYTE_8_WIDETAG] =
1559 scav_vector_unsigned_byte_8;
1560 scavtab[SIMPLE_ARRAY_UNSIGNED_BYTE_15_WIDETAG] =
1561 scav_vector_unsigned_byte_16;
1562 scavtab[SIMPLE_ARRAY_UNSIGNED_BYTE_16_WIDETAG] =
1563 scav_vector_unsigned_byte_16;
1564 #ifdef SIMPLE_ARRAY_SIGNED_BYTE_29_WIDETAG
1565 scavtab[SIMPLE_ARRAY_UNSIGNED_BYTE_29_WIDETAG] =
1566 scav_vector_unsigned_byte_32;
1568 scavtab[SIMPLE_ARRAY_UNSIGNED_BYTE_31_WIDETAG] =
1569 scav_vector_unsigned_byte_32;
1570 scavtab[SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG] =
1571 scav_vector_unsigned_byte_32;
1572 #ifdef SIMPLE_ARRAY_UNSIGNED_BYTE_60_WIDETAG
1573 scavtab[SIMPLE_ARRAY_UNSIGNED_BYTE_64_WIDETAG] =
1574 scav_vector_unsigned_byte_64;
1576 #ifdef SIMPLE_ARRAY_UNSIGNED_BYTE_63_WIDETAG
1577 scavtab[SIMPLE_ARRAY_UNSIGNED_BYTE_64_WIDETAG] =
1578 scav_vector_unsigned_byte_64;
1580 #ifdef SIMPLE_ARRAY_UNSIGNED_BYTE_64_WIDETAG
1581 scavtab[SIMPLE_ARRAY_UNSIGNED_BYTE_64_WIDETAG] =
1582 scav_vector_unsigned_byte_64;
1584 #ifdef SIMPLE_ARRAY_SIGNED_BYTE_8_WIDETAG
1585 scavtab[SIMPLE_ARRAY_SIGNED_BYTE_8_WIDETAG] = scav_vector_unsigned_byte_8;
1587 #ifdef SIMPLE_ARRAY_SIGNED_BYTE_16_WIDETAG
1588 scavtab[SIMPLE_ARRAY_SIGNED_BYTE_16_WIDETAG] =
1589 scav_vector_unsigned_byte_16;
1591 #ifdef SIMPLE_ARRAY_SIGNED_BYTE_30_WIDETAG
1592 scavtab[SIMPLE_ARRAY_SIGNED_BYTE_30_WIDETAG] =
1593 scav_vector_unsigned_byte_32;
1595 #ifdef SIMPLE_ARRAY_SIGNED_BYTE_32_WIDETAG
1596 scavtab[SIMPLE_ARRAY_SIGNED_BYTE_32_WIDETAG] =
1597 scav_vector_unsigned_byte_32;
1599 #ifdef SIMPLE_ARRAY_SIGNED_BYTE_61_WIDETAG
1600 scavtab[SIMPLE_ARRAY_SIGNED_BYTE_61_WIDETAG] =
1601 scav_vector_unsigned_byte_64;
1603 #ifdef SIMPLE_ARRAY_SIGNED_BYTE_64_WIDETAG
1604 scavtab[SIMPLE_ARRAY_SIGNED_BYTE_64_WIDETAG] =
1605 scav_vector_unsigned_byte_64;
1607 scavtab[SIMPLE_ARRAY_SINGLE_FLOAT_WIDETAG] = scav_vector_single_float;
1608 scavtab[SIMPLE_ARRAY_DOUBLE_FLOAT_WIDETAG] = scav_vector_double_float;
1609 #ifdef SIMPLE_ARRAY_LONG_FLOAT_WIDETAG
1610 scavtab[SIMPLE_ARRAY_LONG_FLOAT_WIDETAG] = scav_vector_long_float;
1612 #ifdef SIMPLE_ARRAY_COMPLEX_SINGLE_FLOAT_WIDETAG
1613 scavtab[SIMPLE_ARRAY_COMPLEX_SINGLE_FLOAT_WIDETAG] =
1614 scav_vector_complex_single_float;
1616 #ifdef SIMPLE_ARRAY_COMPLEX_DOUBLE_FLOAT_WIDETAG
1617 scavtab[SIMPLE_ARRAY_COMPLEX_DOUBLE_FLOAT_WIDETAG] =
1618 scav_vector_complex_double_float;
1620 #ifdef SIMPLE_ARRAY_COMPLEX_LONG_FLOAT_WIDETAG
1621 scavtab[SIMPLE_ARRAY_COMPLEX_LONG_FLOAT_WIDETAG] =
1622 scav_vector_complex_long_float;
1624 scavtab[COMPLEX_BASE_STRING_WIDETAG] = scav_boxed;
1625 scavtab[COMPLEX_VECTOR_NIL_WIDETAG] = scav_boxed;
1626 scavtab[COMPLEX_BIT_VECTOR_WIDETAG] = scav_boxed;
1627 scavtab[COMPLEX_VECTOR_WIDETAG] = scav_boxed;
1628 scavtab[COMPLEX_ARRAY_WIDETAG] = scav_boxed;
1629 scavtab[CODE_HEADER_WIDETAG] = scav_code_header;
1630 #ifndef LISP_FEATURE_GENCGC /* FIXME ..._X86 ? */
1631 scavtab[SIMPLE_FUN_HEADER_WIDETAG] = scav_fun_header;
1632 scavtab[RETURN_PC_HEADER_WIDETAG] = scav_return_pc_header;
1634 #ifdef LISP_FEATURE_X86
1635 scavtab[CLOSURE_HEADER_WIDETAG] = scav_closure_header;
1636 scavtab[FUNCALLABLE_INSTANCE_HEADER_WIDETAG] = scav_closure_header;
1638 scavtab[CLOSURE_HEADER_WIDETAG] = scav_boxed;
1639 scavtab[FUNCALLABLE_INSTANCE_HEADER_WIDETAG] = scav_boxed;
1641 scavtab[VALUE_CELL_HEADER_WIDETAG] = scav_boxed;
1642 scavtab[SYMBOL_HEADER_WIDETAG] = scav_boxed;
1643 scavtab[BASE_CHAR_WIDETAG] = scav_immediate;
1644 scavtab[SAP_WIDETAG] = scav_unboxed;
1645 scavtab[UNBOUND_MARKER_WIDETAG] = scav_immediate;
1646 scavtab[INSTANCE_HEADER_WIDETAG] = scav_boxed;
1647 #ifdef LISP_FEATURE_SPARC
1648 scavtab[FDEFN_WIDETAG] = scav_boxed;
1650 scavtab[FDEFN_WIDETAG] = scav_fdefn;
1653 /* transport other table, initialized same way as scavtab */
1654 for (i = 0; i < ((sizeof transother)/(sizeof transother[0])); i++)
1655 transother[i] = trans_lose;
1656 transother[BIGNUM_WIDETAG] = trans_unboxed;
1657 transother[RATIO_WIDETAG] = trans_boxed;
1658 transother[SINGLE_FLOAT_WIDETAG] = trans_unboxed;
1659 transother[DOUBLE_FLOAT_WIDETAG] = trans_unboxed;
1660 #ifdef LONG_FLOAT_WIDETAG
1661 transother[LONG_FLOAT_WIDETAG] = trans_unboxed;
1663 transother[COMPLEX_WIDETAG] = trans_boxed;
1664 #ifdef COMPLEX_SINGLE_FLOAT_WIDETAG
1665 transother[COMPLEX_SINGLE_FLOAT_WIDETAG] = trans_unboxed;
1667 #ifdef COMPLEX_DOUBLE_FLOAT_WIDETAG
1668 transother[COMPLEX_DOUBLE_FLOAT_WIDETAG] = trans_unboxed;
1670 #ifdef COMPLEX_LONG_FLOAT_WIDETAG
1671 transother[COMPLEX_LONG_FLOAT_WIDETAG] = trans_unboxed;
1673 transother[SIMPLE_ARRAY_WIDETAG] = trans_boxed; /* but not GENCGC */
1674 transother[SIMPLE_BASE_STRING_WIDETAG] = trans_base_string;
1675 transother[SIMPLE_BIT_VECTOR_WIDETAG] = trans_vector_bit;
1676 transother[SIMPLE_VECTOR_WIDETAG] = trans_vector;
1677 transother[SIMPLE_ARRAY_NIL_WIDETAG] = trans_vector_nil;
1678 transother[SIMPLE_ARRAY_UNSIGNED_BYTE_2_WIDETAG] =
1679 trans_vector_unsigned_byte_2;
1680 transother[SIMPLE_ARRAY_UNSIGNED_BYTE_4_WIDETAG] =
1681 trans_vector_unsigned_byte_4;
1682 transother[SIMPLE_ARRAY_UNSIGNED_BYTE_7_WIDETAG] =
1683 trans_vector_unsigned_byte_8;
1684 transother[SIMPLE_ARRAY_UNSIGNED_BYTE_8_WIDETAG] =
1685 trans_vector_unsigned_byte_8;
1686 transother[SIMPLE_ARRAY_UNSIGNED_BYTE_15_WIDETAG] =
1687 trans_vector_unsigned_byte_16;
1688 transother[SIMPLE_ARRAY_UNSIGNED_BYTE_16_WIDETAG] =
1689 trans_vector_unsigned_byte_16;
1690 #ifdef SIMPLE_ARRAY_UNSIGNED_BYTE_29_WIDETAG
1691 transother[SIMPLE_ARRAY_UNSIGNED_BYTE_29_WIDETAG] =
1692 trans_vector_unsigned_byte_32;
1694 transother[SIMPLE_ARRAY_UNSIGNED_BYTE_31_WIDETAG] =
1695 trans_vector_unsigned_byte_32;
1696 transother[SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG] =
1697 trans_vector_unsigned_byte_32;
1698 #ifdef SIMPLE_ARRAY_UNSIGNED_BYTE_60_WIDETAG
1699 transother[SIMPLE_ARRAY_UNSIGNED_BYTE_60_WIDETAG] =
1700 trans_vector_unsigned_byte_32;
1702 #ifdef SIMPLE_ARRAY_UNSIGNED_BYTE_63_WIDETAG
1703 transother[SIMPLE_ARRAY_UNSIGNED_BYTE_63_WIDETAG] =
1704 trans_vector_unsigned_byte_64;
1706 #ifdef SIMPLE_ARRAY_UNSIGNED_BYTE_64_WIDETAG
1707 transother[SIMPLE_ARRAY_UNSIGNED_BYTE_64_WIDETAG] =
1708 trans_vector_unsigned_byte_64;
1710 #ifdef SIMPLE_ARRAY_SIGNED_BYTE_8_WIDETAG
1711 transother[SIMPLE_ARRAY_SIGNED_BYTE_8_WIDETAG] =
1712 trans_vector_unsigned_byte_8;
1714 #ifdef SIMPLE_ARRAY_SIGNED_BYTE_16_WIDETAG
1715 transother[SIMPLE_ARRAY_SIGNED_BYTE_16_WIDETAG] =
1716 trans_vector_unsigned_byte_16;
1718 #ifdef SIMPLE_ARRAY_SIGNED_BYTE_30_WIDETAG
1719 transother[SIMPLE_ARRAY_SIGNED_BYTE_30_WIDETAG] =
1720 trans_vector_unsigned_byte_32;
1722 #ifdef SIMPLE_ARRAY_SIGNED_BYTE_32_WIDETAG
1723 transother[SIMPLE_ARRAY_SIGNED_BYTE_32_WIDETAG] =
1724 trans_vector_unsigned_byte_32;
1726 #ifdef SIMPLE_ARRAY_SIGNED_BYTE_61_WIDETAG
1727 transother[SIMPLE_ARRAY_SIGNED_BYTE_61_WIDETAG] =
1728 trans_vector_unsigned_byte_64;
1730 #ifdef SIMPLE_ARRAY_SIGNED_BYTE_64_WIDETAG
1731 transother[SIMPLE_ARRAY_SIGNED_BYTE_64_WIDETAG] =
1732 trans_vector_unsigned_byte_64;
1734 transother[SIMPLE_ARRAY_SINGLE_FLOAT_WIDETAG] =
1735 trans_vector_single_float;
1736 transother[SIMPLE_ARRAY_DOUBLE_FLOAT_WIDETAG] =
1737 trans_vector_double_float;
1738 #ifdef SIMPLE_ARRAY_LONG_FLOAT_WIDETAG
1739 transother[SIMPLE_ARRAY_LONG_FLOAT_WIDETAG] =
1740 trans_vector_long_float;
1742 #ifdef SIMPLE_ARRAY_COMPLEX_SINGLE_FLOAT_WIDETAG
1743 transother[SIMPLE_ARRAY_COMPLEX_SINGLE_FLOAT_WIDETAG] =
1744 trans_vector_complex_single_float;
1746 #ifdef SIMPLE_ARRAY_COMPLEX_DOUBLE_FLOAT_WIDETAG
1747 transother[SIMPLE_ARRAY_COMPLEX_DOUBLE_FLOAT_WIDETAG] =
1748 trans_vector_complex_double_float;
1750 #ifdef SIMPLE_ARRAY_COMPLEX_LONG_FLOAT_WIDETAG
1751 transother[SIMPLE_ARRAY_COMPLEX_LONG_FLOAT_WIDETAG] =
1752 trans_vector_complex_long_float;
1754 transother[COMPLEX_BASE_STRING_WIDETAG] = trans_boxed;
1755 transother[COMPLEX_BIT_VECTOR_WIDETAG] = trans_boxed;
1756 transother[COMPLEX_VECTOR_NIL_WIDETAG] = trans_boxed;
1757 transother[COMPLEX_VECTOR_WIDETAG] = trans_boxed;
1758 transother[COMPLEX_ARRAY_WIDETAG] = trans_boxed;
1759 transother[CODE_HEADER_WIDETAG] = trans_code_header;
1760 transother[SIMPLE_FUN_HEADER_WIDETAG] = trans_fun_header;
1761 transother[RETURN_PC_HEADER_WIDETAG] = trans_return_pc_header;
1762 transother[CLOSURE_HEADER_WIDETAG] = trans_boxed;
1763 transother[FUNCALLABLE_INSTANCE_HEADER_WIDETAG] = trans_boxed;
1764 transother[VALUE_CELL_HEADER_WIDETAG] = trans_boxed;
1765 transother[SYMBOL_HEADER_WIDETAG] = trans_boxed;
1766 transother[BASE_CHAR_WIDETAG] = trans_immediate;
1767 transother[SAP_WIDETAG] = trans_unboxed;
1768 transother[UNBOUND_MARKER_WIDETAG] = trans_immediate;
1769 transother[WEAK_POINTER_WIDETAG] = trans_weak_pointer;
1770 transother[INSTANCE_HEADER_WIDETAG] = trans_boxed;
1771 transother[FDEFN_WIDETAG] = trans_boxed;
1773 /* size table, initialized the same way as scavtab */
1774 for (i = 0; i < ((sizeof sizetab)/(sizeof sizetab[0])); i++)
1775 sizetab[i] = size_lose;
1776 for (i = 0; i < (1<<(N_WIDETAG_BITS-N_LOWTAG_BITS)); i++) {
1777 sizetab[EVEN_FIXNUM_LOWTAG|(i<<N_LOWTAG_BITS)] = size_immediate;
1778 sizetab[FUN_POINTER_LOWTAG|(i<<N_LOWTAG_BITS)] = size_pointer;
1779 /* skipping OTHER_IMMEDIATE_0_LOWTAG */
1780 sizetab[LIST_POINTER_LOWTAG|(i<<N_LOWTAG_BITS)] = size_pointer;
1781 sizetab[ODD_FIXNUM_LOWTAG|(i<<N_LOWTAG_BITS)] = size_immediate;
1782 sizetab[INSTANCE_POINTER_LOWTAG|(i<<N_LOWTAG_BITS)] = size_pointer;
1783 /* skipping OTHER_IMMEDIATE_1_LOWTAG */
1784 sizetab[OTHER_POINTER_LOWTAG|(i<<N_LOWTAG_BITS)] = size_pointer;
1786 sizetab[BIGNUM_WIDETAG] = size_unboxed;
1787 sizetab[RATIO_WIDETAG] = size_boxed;
1788 sizetab[SINGLE_FLOAT_WIDETAG] = size_unboxed;
1789 sizetab[DOUBLE_FLOAT_WIDETAG] = size_unboxed;
1790 #ifdef LONG_FLOAT_WIDETAG
1791 sizetab[LONG_FLOAT_WIDETAG] = size_unboxed;
1793 sizetab[COMPLEX_WIDETAG] = size_boxed;
1794 #ifdef COMPLEX_SINGLE_FLOAT_WIDETAG
1795 sizetab[COMPLEX_SINGLE_FLOAT_WIDETAG] = size_unboxed;
1797 #ifdef COMPLEX_DOUBLE_FLOAT_WIDETAG
1798 sizetab[COMPLEX_DOUBLE_FLOAT_WIDETAG] = size_unboxed;
1800 #ifdef COMPLEX_LONG_FLOAT_WIDETAG
1801 sizetab[COMPLEX_LONG_FLOAT_WIDETAG] = size_unboxed;
1803 sizetab[SIMPLE_ARRAY_WIDETAG] = size_boxed;
1804 sizetab[SIMPLE_BASE_STRING_WIDETAG] = size_base_string;
1805 sizetab[SIMPLE_BIT_VECTOR_WIDETAG] = size_vector_bit;
1806 sizetab[SIMPLE_VECTOR_WIDETAG] = size_vector;
1807 sizetab[SIMPLE_ARRAY_NIL_WIDETAG] = size_vector_nil;
1808 sizetab[SIMPLE_ARRAY_UNSIGNED_BYTE_2_WIDETAG] =
1809 size_vector_unsigned_byte_2;
1810 sizetab[SIMPLE_ARRAY_UNSIGNED_BYTE_4_WIDETAG] =
1811 size_vector_unsigned_byte_4;
1812 sizetab[SIMPLE_ARRAY_UNSIGNED_BYTE_7_WIDETAG] =
1813 size_vector_unsigned_byte_8;
1814 sizetab[SIMPLE_ARRAY_UNSIGNED_BYTE_8_WIDETAG] =
1815 size_vector_unsigned_byte_8;
1816 sizetab[SIMPLE_ARRAY_UNSIGNED_BYTE_15_WIDETAG] =
1817 size_vector_unsigned_byte_16;
1818 sizetab[SIMPLE_ARRAY_UNSIGNED_BYTE_16_WIDETAG] =
1819 size_vector_unsigned_byte_16;
1820 #ifdef SIMPLE_ARRAY_UNSIGNED_BYTE_29_WIDETAG
1821 sizetab[SIMPLE_ARRAY_UNSIGNED_BYTE_29_WIDETAG] =
1822 size_vector_unsigned_byte_32;
1824 sizetab[SIMPLE_ARRAY_UNSIGNED_BYTE_31_WIDETAG] =
1825 size_vector_unsigned_byte_32;
1826 sizetab[SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG] =
1827 size_vector_unsigned_byte_32;
1828 #ifdef SIMPLE_ARRAY_UNSIGNED_BYTE_60_WIDETAG
1829 sizetab[SIMPLE_ARRAY_UNSIGNED_BYTE_60_WIDETAG] =
1830 size_vector_unsigned_byte_64;
1832 #ifdef SIMPLE_ARRAY_UNSIGNED_BYTE_63_WIDETAG
1833 sizetab[SIMPLE_ARRAY_UNSIGNED_BYTE_63_WIDETAG] =
1834 size_vector_unsigned_byte_64;
1836 #ifdef SIMPLE_ARRAY_UNSIGNED_BYTE_64_WIDETAG
1837 sizetab[SIMPLE_ARRAY_UNSIGNED_BYTE_64_WIDETAG] =
1838 size_vector_unsigned_byte_64;
1840 #ifdef SIMPLE_ARRAY_SIGNED_BYTE_8_WIDETAG
1841 sizetab[SIMPLE_ARRAY_SIGNED_BYTE_8_WIDETAG] = size_vector_unsigned_byte_8;
1843 #ifdef SIMPLE_ARRAY_SIGNED_BYTE_16_WIDETAG
1844 sizetab[SIMPLE_ARRAY_SIGNED_BYTE_16_WIDETAG] =
1845 size_vector_unsigned_byte_16;
1847 #ifdef SIMPLE_ARRAY_SIGNED_BYTE_30_WIDETAG
1848 sizetab[SIMPLE_ARRAY_SIGNED_BYTE_30_WIDETAG] =
1849 size_vector_unsigned_byte_32;
1851 #ifdef SIMPLE_ARRAY_SIGNED_BYTE_32_WIDETAG
1852 sizetab[SIMPLE_ARRAY_SIGNED_BYTE_32_WIDETAG] =
1853 size_vector_unsigned_byte_32;
1855 #ifdef SIMPLE_ARRAY_SIGNED_BYTE_61_WIDETAG
1856 sizetab[SIMPLE_ARRAY_SIGNED_BYTE_61_WIDETAG] =
1857 size_vector_unsigned_byte_64;
1859 #ifdef SIMPLE_ARRAY_SIGNED_BYTE_64_WIDETAG
1860 sizetab[SIMPLE_ARRAY_SIGNED_BYTE_64_WIDETAG] =
1861 size_vector_unsigned_byte_64;
1863 sizetab[SIMPLE_ARRAY_SINGLE_FLOAT_WIDETAG] = size_vector_single_float;
1864 sizetab[SIMPLE_ARRAY_DOUBLE_FLOAT_WIDETAG] = size_vector_double_float;
1865 #ifdef SIMPLE_ARRAY_LONG_FLOAT_WIDETAG
1866 sizetab[SIMPLE_ARRAY_LONG_FLOAT_WIDETAG] = size_vector_long_float;
1868 #ifdef SIMPLE_ARRAY_COMPLEX_SINGLE_FLOAT_WIDETAG
1869 sizetab[SIMPLE_ARRAY_COMPLEX_SINGLE_FLOAT_WIDETAG] =
1870 size_vector_complex_single_float;
1872 #ifdef SIMPLE_ARRAY_COMPLEX_DOUBLE_FLOAT_WIDETAG
1873 sizetab[SIMPLE_ARRAY_COMPLEX_DOUBLE_FLOAT_WIDETAG] =
1874 size_vector_complex_double_float;
1876 #ifdef SIMPLE_ARRAY_COMPLEX_LONG_FLOAT_WIDETAG
1877 sizetab[SIMPLE_ARRAY_COMPLEX_LONG_FLOAT_WIDETAG] =
1878 size_vector_complex_long_float;
1880 sizetab[COMPLEX_BASE_STRING_WIDETAG] = size_boxed;
1881 sizetab[COMPLEX_VECTOR_NIL_WIDETAG] = size_boxed;
1882 sizetab[COMPLEX_BIT_VECTOR_WIDETAG] = size_boxed;
1883 sizetab[COMPLEX_VECTOR_WIDETAG] = size_boxed;
1884 sizetab[COMPLEX_ARRAY_WIDETAG] = size_boxed;
1885 sizetab[CODE_HEADER_WIDETAG] = size_code_header;
1887 /* We shouldn't see these, so just lose if it happens. */
1888 sizetab[SIMPLE_FUN_HEADER_WIDETAG] = size_function_header;
1889 sizetab[RETURN_PC_HEADER_WIDETAG] = size_return_pc_header;
1891 sizetab[CLOSURE_HEADER_WIDETAG] = size_boxed;
1892 sizetab[FUNCALLABLE_INSTANCE_HEADER_WIDETAG] = size_boxed;
1893 sizetab[VALUE_CELL_HEADER_WIDETAG] = size_boxed;
1894 sizetab[SYMBOL_HEADER_WIDETAG] = size_boxed;
1895 sizetab[BASE_CHAR_WIDETAG] = size_immediate;
1896 sizetab[SAP_WIDETAG] = size_unboxed;
1897 sizetab[UNBOUND_MARKER_WIDETAG] = size_immediate;
1898 sizetab[WEAK_POINTER_WIDETAG] = size_weak_pointer;
1899 sizetab[INSTANCE_HEADER_WIDETAG] = size_boxed;
1900 sizetab[FDEFN_WIDETAG] = size_boxed;
1904 /* Find the code object for the given pc, or return NULL on
1907 component_ptr_from_pc(lispobj *pc)
1909 lispobj *object = NULL;
1911 if ( (object = search_read_only_space(pc)) )
1913 else if ( (object = search_static_space(pc)) )
1916 object = search_dynamic_space(pc);
1918 if (object) /* if we found something */
1919 if (widetag_of(*object) == CODE_HEADER_WIDETAG)