]> git.eshelyaron.com Git - emacs.git/commitdiff
Port USE_LOCAL_ALLOCATORS code to clang 3.4 x86-64.
authorPaul Eggert <eggert@cs.ucla.edu>
Thu, 18 Sep 2014 05:40:17 +0000 (22:40 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Thu, 18 Sep 2014 05:40:17 +0000 (22:40 -0700)
Revert previous lisp.h change, and install the following instead.
* lisp.h (USE_LOCAL_ALLOCATORS): Define only if __GNUC__ &&
!__clang__.  This works with GCC and with clang and is safer for
compilers we don't know about.

src/ChangeLog
src/lisp.h

index b91221ef8f3bc0715d178e29ee730d0d146e890e..010f5fd95dd67fd868588ab72708ef541d1560a4 100644 (file)
@@ -1,9 +1,9 @@
 2014-09-18  Paul Eggert  <eggert@cs.ucla.edu>
 
        Port USE_LOCAL_ALLOCATORS code to clang 3.4 x86-64.
-       * lisp.h (ALLOCA_FIXUP): New constant.
-       (LOCAL_ALLOCA): New macro.
-       (local_cons, make_local_vector, make_local_string): Use them.
+       * lisp.h (USE_LOCAL_ALLOCATORS): Define only if __GNUC__ &&
+       !__clang__.  This works with GCC and with clang and is safer for
+       compilers we don't know about.
        (local_cons): Rename parameter to make capture less likely.
 
 2014-09-17  Samuel Bronson  <naesten@gmail.com>
index 7a3e0d6a8a35abb3726d32087b1a9ba86703528a..c5e698cc7c7f6706525407b0241ff9c0c924ec8a 100644 (file)
@@ -4599,30 +4599,22 @@ verify (sizeof (struct Lisp_Cons) == sizeof (union Aligned_Cons));
 # define scoped_list3(x, y, z) list3 (x, y, z)
 #endif
 
-#if USE_STACK_LISP_OBJECTS && HAVE_STATEMENT_EXPRESSIONS
-
+/* Local allocators require both statement expressions and a
+   GCALIGNMENT-aligned alloca.  clang's alloca isn't properly aligned
+   in some cases.  In the absence of solid information, play it safe
+   for other non-GCC compilers.  */
+#if (USE_STACK_LISP_OBJECTS && HAVE_STATEMENT_EXPRESSIONS \
+     && __GNUC__ && !__clang__)
 # define USE_LOCAL_ALLOCATORS
+#endif
 
-/* Alignment fixup needed for alloca.  GCC aligns alloca properly already,
-   Clang sometimes doesn't, and play it safe for other random compilers.  */
-# if __GNUC__ && !__clang__
-enum { ALLOCA_FIXUP = 0 };
-# else
-enum { ALLOCA_FIXUP = GCALIGNMENT - 1 };
-# endif
-
-/* Declare a void * variable PTR and set it to a properly-aligned array of
-   N newly allocated bytes with function lifetime.  */
-# define LOCAL_ALLOCA(ptr, n)                          \
-    void *ptr = alloca ((n) + ALLOCA_FIXUP);           \
-    ptr = (void *) ((intptr_t) ptr_ & ~(ALLOCA_FIXUP))
+#ifdef USE_LOCAL_ALLOCATORS
 
 /* Return a function-scoped cons whose car is X and cdr is Y.  */
 
 # define local_cons(x, y)                                              \
     ({                                                                 \
-       LOCAL_ALLOCA (ptr_, sizeof (struct Lisp_Cons));                 \
-       struct Lisp_Cons *c_ = ptr_;                                    \
+       struct Lisp_Cons *c_ = alloca (sizeof (struct Lisp_Cons));      \
        c_->car = (x);                                                  \
        c_->u.cdr = (y);                                                        \
        make_lisp_ptr (c_, Lisp_Cons);                                  \
@@ -4640,9 +4632,9 @@ enum { ALLOCA_FIXUP = GCALIGNMENT - 1 };
        ptrdiff_t size_ = size;                                         \
        Lisp_Object init_ = init;                                       \
        Lisp_Object vec_;                                               \
-       if (size_ <= (MAX_ALLOCA - ALLOCA_FIXUP - header_size) / word_size) \
+       if (size_ <= (MAX_ALLOCA - header_size) / word_size)            \
         {                                                              \
-          LOCAL_ALLOCA (ptr_, size_ * word_size + header_size);        \
+          void *ptr_ = alloca (size_ * word_size + header_size);       \
           vec_ = local_vector_init (ptr_, size_, init_);               \
         }                                                              \
        else                                                            \
@@ -4657,10 +4649,10 @@ enum { ALLOCA_FIXUP = GCALIGNMENT - 1 };
        char const *data_ = data;                                       \
        ptrdiff_t nbytes_ = nbytes;                                     \
        Lisp_Object string_;                                            \
-       if (nbytes_                                                     \
-          <= MAX_ALLOCA - ALLOCA_FIXUP - sizeof (struct Lisp_String) - 1) \
+       if (nbytes_ <= MAX_ALLOCA - sizeof (struct Lisp_String) - 1)    \
         {                                                              \
-          LOCAL_ALLOCA (ptr_, sizeof (struct Lisp_String) + 1 + bytes_); \
+          struct Lisp_String *ptr_                                     \
+            = alloca (sizeof (struct Lisp_String) + 1 + nbytes_);      \
           string_ = local_string_init (ptr_, data_, nbytes_);          \
         }                                                              \
        else                                                            \