[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] trunk r117897: Port USE_LOCAL_ALLOCATORS code to clang 3.4
From: |
Paul Eggert |
Subject: |
[Emacs-diffs] trunk r117897: Port USE_LOCAL_ALLOCATORS code to clang 3.4 x86-64. |
Date: |
Thu, 18 Sep 2014 01:03:44 +0000 |
User-agent: |
Bazaar (2.6b2) |
------------------------------------------------------------
revno: 117897
revision-id: address@hidden
parent: address@hidden
committer: Paul Eggert <address@hidden>
branch nick: trunk
timestamp: Wed 2014-09-17 18:03:40 -0700
message:
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.
(local_cons): Rename parameter to make capture less likely.
modified:
src/ChangeLog changelog-20091113204419-o5vbwnq5f7feedwu-1438
src/lisp.h lisp.h-20091113204419-o5vbwnq5f7feedwu-253
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog 2014-09-17 19:58:31 +0000
+++ b/src/ChangeLog 2014-09-18 01:03:40 +0000
@@ -1,3 +1,11 @@
+2014-09-18 Paul Eggert <address@hidden>
+
+ 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.
+ (local_cons): Rename parameter to make capture less likely.
+
2014-09-17 Samuel Bronson <address@hidden>
* unexmacosx.c (copy_data_segment): Port to GCC 4.6+ (Bug#9927).
=== modified file 'src/lisp.h'
--- a/src/lisp.h 2014-09-17 18:27:36 +0000
+++ b/src/lisp.h 2014-09-18 01:03:40 +0000
@@ -4603,14 +4603,29 @@
# define USE_LOCAL_ALLOCATORS
+/* 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))
+
/* Return a function-scoped cons whose car is X and cdr is Y. */
# define local_cons(x, y) \
({ \
- struct Lisp_Cons *c = alloca (sizeof (struct Lisp_Cons)); \
- c->car = (x); \
- c->u.cdr = (y); \
- make_lisp_ptr (c, Lisp_Cons); \
+ LOCAL_ALLOCA (ptr_, sizeof (struct Lisp_Cons)); \
+ struct Lisp_Cons *c_ = ptr_; \
+ c_->car = (x); \
+ c_->u.cdr = (y);
\
+ make_lisp_ptr (c_, Lisp_Cons); \
})
# define local_list1(x) local_cons (x, Qnil)
@@ -4625,9 +4640,9 @@
ptrdiff_t size_ = size; \
Lisp_Object init_ = init; \
Lisp_Object vec_; \
- if (size_ <= (MAX_ALLOCA - header_size) / word_size) \
+ if (size_ <= (MAX_ALLOCA - ALLOCA_FIXUP - header_size) / word_size) \
{ \
- void *ptr_ = alloca (size_ * word_size + header_size); \
+ LOCAL_ALLOCA (ptr_, size_ * word_size + header_size); \
vec_ = local_vector_init (ptr_, size_, init_); \
} \
else \
@@ -4642,10 +4657,10 @@
char const *data_ = data; \
ptrdiff_t nbytes_ = nbytes; \
Lisp_Object string_; \
- if (nbytes_ <= MAX_ALLOCA - sizeof (struct Lisp_String) - 1) \
+ if (nbytes_ \
+ <= MAX_ALLOCA - ALLOCA_FIXUP - sizeof (struct Lisp_String) - 1) \
{ \
- struct Lisp_String *ptr_ \
- = alloca (sizeof (struct Lisp_String) + 1 + nbytes_); \
+ LOCAL_ALLOCA (ptr_, sizeof (struct Lisp_String) + 1 + bytes_); \
string_ = local_string_init (ptr_, data_, nbytes_); \
} \
else \
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] trunk r117897: Port USE_LOCAL_ALLOCATORS code to clang 3.4 x86-64.,
Paul Eggert <=