X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fgc-common.c;h=40d55471a171c3c3be261715f2732088b0bb155d;hb=10cdee0326e9e8a5bbfe1d8312a73d58f023fb5f;hp=abd1eae6fca499fb8e424de59682b0e79682c5c8;hpb=fbde18e9b7d8e67e24f628638be4f293cb128101;p=sbcl.git diff --git a/src/runtime/gc-common.c b/src/runtime/gc-common.c index abd1eae..40d5547 100644 --- a/src/runtime/gc-common.c +++ b/src/runtime/gc-common.c @@ -156,25 +156,28 @@ scavenge(lispobj *start, long n_words) n_words_scavenged = 1; } } -#ifndef LISP_FEATURE_GENCGC - /* this workaround is probably not necessary for gencgc; at least, the - * behaviour it describes has never been reported */ - else if (n_words==1) { - /* there are some situations where an - other-immediate may end up in a descriptor - register. I'm not sure whether this is - supposed to happen, but if it does then we +#if !defined(LISP_FEATURE_X86) && !defined(LISP_FEATURE_X86_64) + /* This workaround is probably not needed for those ports + which don't have a partitioned register set (and therefore + scan the stack conservatively for roots). */ + else if (n_words == 1) { + /* there are some situations where an other-immediate may + end up in a descriptor register. I'm not sure whether + this is supposed to happen, but if it does then we don't want to (a) barf or (b) scavenge over the - data-block, because there isn't one. So, if - we're checking a single word and it's anything - other than a pointer, just hush it up */ - int type=widetag_of(object); - n_words_scavenged=1; - - if ((scavtab[type]==scav_lose) || - (((scavtab[type])(start,object))>1)) { - 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", - object,start); + data-block, because there isn't one. So, if we're + checking a single word and it's anything other than a + pointer, just hush it up */ + int widetag = widetag_of(object); + n_words_scavenged = 1; + + if ((scavtab[widetag] == scav_lose) || + (((sizetab[widetag])(object_ptr)) > 1)) { + fprintf(stderr,"warning: \ +attempted to scavenge non-descriptor value %x at %p.\n\n\ +If you can reproduce this warning, please send a bug report\n\ +(see manual page for details).\n", + object, object_ptr); } } #endif @@ -187,8 +190,8 @@ scavenge(lispobj *start, long n_words) (scavtab[widetag_of(object)])(object_ptr, object); } } - gc_assert_verbose(object_ptr == end, "Final object pointer %p, end %p\n", - object_ptr, end); + gc_assert_verbose(object_ptr == end, "Final object pointer %p, start %p, end %p\n", + object_ptr, start, end); } static lispobj trans_fun_header(lispobj object); /* forward decls */ @@ -314,11 +317,18 @@ trans_code(struct code *code) fheaderl = fheaderp->next; prev_pointer = &nfheaderp->next; } +#ifdef LISP_FEATURE_GENCGC + /* Cheneygc doesn't need this os_flush_icache, it flushes the whole + spaces once when all copying is done. */ os_flush_icache((os_vm_address_t) (((long *)new_code) + nheader_words), ncode_words * sizeof(long)); -#ifdef LISP_FEATURE_GENCGC + +#endif + +#if defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64) gencgc_apply_code_fixups(code, new_code); #endif + return new_code; } @@ -695,7 +705,7 @@ size_boxed(lispobj *where) /* Note: on the sparc we don't have to do anything special for fdefns, */ /* 'cause the raw-addr has a function lowtag. */ -#ifndef LISP_FEATURE_SPARC +#if !defined(LISP_FEATURE_SPARC) static long scav_fdefn(lispobj *where, lispobj object) { @@ -1712,7 +1722,7 @@ gc_init_tables(void) scavtab[COMPLEX_VECTOR_WIDETAG] = scav_boxed; scavtab[COMPLEX_ARRAY_WIDETAG] = scav_boxed; scavtab[CODE_HEADER_WIDETAG] = scav_code_header; -#ifndef LISP_FEATURE_GENCGC /* FIXME ..._X86 ? */ +#if !defined(LISP_FEATURE_X86) && !defined(LISP_FEATURE_X86_64) scavtab[SIMPLE_FUN_HEADER_WIDETAG] = scav_fun_header; scavtab[RETURN_PC_HEADER_WIDETAG] = scav_return_pc_header; #endif @@ -1730,7 +1740,7 @@ gc_init_tables(void) scavtab[UNBOUND_MARKER_WIDETAG] = scav_immediate; scavtab[NO_TLS_VALUE_MARKER_WIDETAG] = scav_immediate; scavtab[INSTANCE_HEADER_WIDETAG] = scav_instance; -#ifdef LISP_FEATURE_SPARC +#if defined(LISP_FEATURE_SPARC) scavtab[FDEFN_WIDETAG] = scav_boxed; #else scavtab[FDEFN_WIDETAG] = scav_fdefn;