--- src/lisp.h +++ src/lisp.h 2010-10-18 13:46:05.240426350 +0000 @@ -375,7 +375,7 @@ enum pvec_type For example, if tem is a Lisp_Object whose type is Lisp_Cons, XCONS (tem) is the struct Lisp_Cons * pointing to the memory for that cons. */ -#ifndef USE_LISP_UNION_TYPE +#if !defined(USE_LISP_UNION_TYPE) && !defined(__s390x__) /* Return a perfect hash of the Lisp_Object representation. */ #define XHASH(a) (a) @@ -385,19 +385,31 @@ enum pvec_type #define TYPEMASK ((((EMACS_INT) 1) << GCTYPEBITS) - 1) #define XTYPE(a) ((enum Lisp_Type) (((EMACS_UINT) (a)) & TYPEMASK)) #ifdef USE_2_TAGS_FOR_INTS +#ifndef XINT # define XINT(a) (((EMACS_INT) (a)) >> (GCTYPEBITS - 1)) +#endif +#ifndef XUINT # define XUINT(a) (((EMACS_UINT) (a)) >> (GCTYPEBITS - 1)) +#endif # define make_number(N) (((EMACS_INT) (N)) << (GCTYPEBITS - 1)) #else +#ifndef XINT # define XINT(a) (((EMACS_INT) (a)) >> GCTYPEBITS) +#endif +#ifndef XUINT # define XUINT(a) (((EMACS_UINT) (a)) >> GCTYPEBITS) +#endif # define make_number(N) (((EMACS_INT) (N)) << GCTYPEBITS) #endif +#ifndef XSET #define XSET(var, type, ptr) \ (eassert (XTYPE (ptr) == 0), /* Check alignment. */ \ (var) = ((EMACS_INT) (type)) | ((EMACS_INT) (ptr))) +#endif +#ifndef XPNTR #define XPNTR(a) ((EMACS_INT) ((a) & ~TYPEMASK)) +#endif #else /* not USE_LSB_TAG */ @@ -418,19 +430,29 @@ enum pvec_type /* Extract the value of a Lisp_Object as a (un)signed integer. */ #ifdef USE_2_TAGS_FOR_INTS +#ifndef XINT # define XINT(a) ((((EMACS_INT) (a)) << (GCTYPEBITS - 1)) >> (GCTYPEBITS - 1)) +#endif +#ifndef XUINT # define XUINT(a) ((EMACS_UINT) ((a) & (1 + (VALMASK << 1)))) +#endif # define make_number(N) ((((EMACS_INT) (N)) & (1 + (VALMASK << 1)))) #else +#ifndef XINT # define XINT(a) ((((EMACS_INT) (a)) << (BITS_PER_EMACS_INT - VALBITS)) \ >> (BITS_PER_EMACS_INT - VALBITS)) +#endif +#ifndef XUINT # define XUINT(a) ((EMACS_UINT) ((a) & VALMASK)) +#endif # define make_number(N) \ ((((EMACS_INT) (N)) & VALMASK) | ((EMACS_INT) Lisp_Int) << VALBITS) #endif +#ifndef XSET #define XSET(var, type, ptr) \ ((var) = ((EMACS_INT)(type) << VALBITS) + ((EMACS_INT) (ptr) & VALMASK)) +#endif #define XPNTR(a) ((EMACS_UINT) ((a) & VALMASK)) @@ -457,14 +479,18 @@ enum pvec_type #define XINT(a) ((a).s.val) #endif /* EXPLICIT_SIGN_EXTEND */ +#ifndef XUINT #define XUINT(a) ((a).u.val) +#endif #ifdef USE_LSB_TAG +#ifndef XSET # define XSET(var, vartype, ptr) \ (eassert ((((EMACS_UINT) (ptr)) & ((1 << GCTYPEBITS) - 1)) == 0), \ (var).u.val = ((EMACS_UINT) (ptr)) >> GCTYPEBITS, \ (var).u.type = ((char) (vartype))) +#endif /* Some versions of gcc seem to consider the bitfield width when issuing the "cast to pointer from integer of different size" warning, so the @@ -479,8 +505,10 @@ enum pvec_type # define XFASTINT(a) ((a).i + 0) # define XSETFASTINT(a, b) ((a).i = (b)) +#ifndef XSET # define XSET(var, vartype, ptr) \ (((var).s.val = ((EMACS_INT) (ptr))), ((var).s.type = ((char) (vartype)))) +#endif #endif /* !USE_LSB_TAG */ --- src/m/ibms390x.h +++ src/m/ibms390x.h 2009-08-11 12:47:07.000000000 +0000 @@ -78,7 +78,9 @@ NOTE-END */ working alloca function and it should be used. Undefine it if an assembler-language alloca in the file alloca.s should be used. */ +#ifndef HAVE_ALLOCA #define HAVE_ALLOCA +#endif /* On the 64 bit architecture, we can use 60 bits for addresses */