Subject: Re: bug#10780: 24.0.93 fails to build with 'Invalid function: "DEAD"'

From: Dan Horák <[email-masked]>
Date: Tue, 21 Feb 2012 10:32:19 +0100

Paul Eggert píše v Po 20. 02. 2012 v 15:14 -0800: 
> On 02/15/2012 02:09 AM, Andreas Schwab wrote:
> 
> > What about local variables in registers?  They are split between two
> > registers, but mark_stack does not handle that.
> 
> True.  Teerrroooo.  Thanks for diagnosing that.
> 
> I pushed the following fix into the trunk.  It's needed
> regardless of this particular bug.  Dan, can you please
> check whether it indeed fixes the bug for you?  Thanks.

yes, this change fixed the issue for me. Thanks to all involved.

> 
> Fix crash due to non-contiguous EMACS_INT (Bug#10780).
> * lisp.h (VALBITS): Move definition up, so that USE_LSB_TAG can use it.
> (USE_LSB_TAG): Do not define if UINTPTR_MAX >> VALBITS == 0.
> It's useless in that case, and it can cause problems on hosts
> that allocate halves of EMACS_INT values separately.
> Reported by Dan Horák.  Diagnosed by Andreas Schwab in
> <http://debbugs.gnu.org/cgi/bugreport.cgi?bug=10780#30>.
> * mem-limits.h (EXCEEDS_LISP_PTR): Define to 0 on hosts where
> UINTPTR_MAX >> VALBITS == 0.  This is required by the above change;
> it avoids undefined behavior on hosts where shifting right by more
> than the word width has undefined behavior.
> === modified file 'src/lisp.h'
> --- src/lisp.h	2012-01-19 07:21:25 +0000
> +++ src/lisp.h	2012-02-20 16:27:49 +0000
> @@ -168,6 +168,10 @@
>  #define GCTYPEBITS 3
>  #endif
> 
> +#ifndef VALBITS
> +#define VALBITS (BITS_PER_EMACS_INT - GCTYPEBITS)
> +#endif
> +
>  #ifndef NO_DECL_ALIGN
>  # ifndef DECL_ALIGN
>  #  if HAVE_ATTRIBUTE_ALIGNED
> @@ -191,7 +195,15 @@
>       || defined DARWIN_OS || defined __sun)
>  /* We also need to be able to specify mult-of-8 alignment on static vars.  */
>  # if defined DECL_ALIGN
> -#  define USE_LSB_TAG
> +/* mark_maybe_object assumes that EMACS_INT values are contiguous,
> +   but this is not true on some hosts where EMACS_INT is wider than a pointer,
> +   as they may allocate the halves of an EMACS_INT separately.
> +   On these hosts USE_LSB_TAG is not needed because the top bits of an
> +   EMACS_INT are unused, so define USE_LSB_TAG only on hosts where it
> +   might be useful.  */
> +#  if UINTPTR_MAX >> VALBITS != 0
> +#   define USE_LSB_TAG
> +#  endif
>  # endif
>  #endif
> 
> @@ -309,11 +321,6 @@
>      Lisp_Fwd_Kboard_Obj,	/* Fwd to a Lisp_Object field of kboards.  */
>    };
> 
> -/* These values are overridden by the m- file on some machines.  */
> -#ifndef VALBITS
> -#define VALBITS (BITS_PER_EMACS_INT - GCTYPEBITS)
> -#endif
> -
>  #ifdef USE_LISP_UNION_TYPE
> 
>  #ifndef WORDS_BIGENDIAN
> 
> === modified file 'src/mem-limits.h'
> --- src/mem-limits.h	2012-01-19 07:21:25 +0000
> +++ src/mem-limits.h	2012-02-20 22:53:46 +0000
> @@ -34,7 +34,7 @@
>  #endif
> 
>  extern char *start_of_data (void);
> -#if defined USE_LSB_TAG
> +#if defined USE_LSB_TAG || UINTPTR_MAX >> VALBITS == 0
>  #define EXCEEDS_LISP_PTR(ptr) 0
>  #elif defined DATA_SEG_BITS
>  #define EXCEEDS_LISP_PTR(ptr) \
> 
>