--- src/lisp.h
+++ src/lisp.h	2007-05-22 14:14:07.339045409 +0200
@@ -344,7 +344,7 @@ enum pvec_type
 /* We also need to be able to specify mult-of-8 alignment on static vars.  */
 # if defined DECL_ALIGN
 /* We currently do not support USE_LSB_TAG with a union Lisp_Object.  */
-#  if defined NO_UNION_TYPE
+#  if defined(NO_UNION_TYPE) && !defined(__s390x__)
 #   define USE_LSB_TAG
 #  endif
 # endif
@@ -369,11 +369,17 @@ enum pvec_type
 
 #define TYPEMASK ((((EMACS_INT) 1) << GCTYPEBITS) - 1)
 #define XTYPE(a) ((enum Lisp_Type) (((EMACS_UINT) (a)) & TYPEMASK))
+#ifndef XINT
 #define XINT(a) (((EMACS_INT) (a)) >> GCTYPEBITS)
+#endif
+#ifndef XUINT
 #define XUINT(a) (((EMACS_UINT) (a)) >> GCTYPEBITS)
+#endif
+#ifndef XSET
 #define XSET(var, type, ptr)					\
     (eassert (XTYPE (ptr) == 0), /* Check alignment.  */	\
      (var) = ((EMACS_INT) (type)) | ((EMACS_INT) (ptr)))
+#endif
 #define make_number(N) (((EMACS_INT) (N)) << GCTYPEBITS)
 
 /* XFASTINT and XSETFASTINT are for use when the integer is known to be
@@ -382,7 +388,9 @@ enum pvec_type
 #define XFASTINT(a) XINT (a)
 #define XSETFASTINT(a, b) ((a) = make_number (b))
 
+#ifndef XPNTR
 #define XPNTR(a) ((EMACS_INT) ((a) & ~TYPEMASK))
+#endif
 
 #else  /* not USE_LSB_TAG */
 
@@ -440,16 +448,24 @@ enum pvec_type
 
 #ifdef EXPLICIT_SIGN_EXTEND
 /* Make sure we sign-extend; compilers have been known to fail to do so.  */
+#ifndef XINT
 #define XINT(a) (((a).s.val << (BITS_PER_EMACS_INT - VALBITS)) \
 		 >> (BITS_PER_EMACS_INT - VALBITS))
+#endif
 #else
+#ifndef XINT
 #define XINT(a) ((a).s.val)
+#endif
 #endif /* EXPLICIT_SIGN_EXTEND */
 
+#ifndef XUINT
 #define XUINT(a) ((a).u.val)
+#endif
 
+#ifndef XSET
 #define XSET(var, vartype, ptr) \
    (((var).s.val = ((EMACS_INT) (ptr))), ((var).s.type = ((char) (vartype))))
+#endif
 
 #if __GNUC__ >= 2 && defined (__OPTIMIZE__)
 #define make_number(N) \
--- src/m/ibms390x.h
+++ src/m/ibms390x.h	2007-05-22 14:09:03.982707261 +0200
@@ -105,7 +105,9 @@ NOTE-END */
    in the file alloca.s should be used.  */
 
 #undef C_ALLOCA
+#ifndef HAVE_ALLOCA
 #define HAVE_ALLOCA
+#endif
 
 /* Define NO_REMAP if memory segmentation makes it not work well
    to change the boundary between the text section and data section