aboutsummaryrefslogtreecommitdiffstats
path: root/src/process.h
diff options
context:
space:
mode:
authorPaul Eggert2011-04-25 00:14:46 -0700
committerPaul Eggert2011-04-25 00:14:46 -0700
commiteab3844f965646b62e242aa622754b86d1fd3444 (patch)
tree10246105e5facc5d61ccf797dfa05debdb1877c1 /src/process.h
parent0df1eac54fdf82a80a7611fe421d94a23ebd4a0a (diff)
downloademacs-eab3844f965646b62e242aa622754b86d1fd3444.tar.gz
emacs-eab3844f965646b62e242aa622754b86d1fd3444.zip
lisp.h: Fix a problem with aliasing and vector headers.
GCC 4.6.0 optimizes based on type-based alias analysis. For example, if b is of type struct buffer * and v of type struct Lisp_Vector *, then gcc -O2 was incorrectly assuming that &b->size != &v->size, and therefore "v->size = 1; b->size = 2; return v->size;" must therefore return 1. This assumption is incorrect for Emacs, since it type-puns struct Lisp_Vector * with many other types. To fix this problem, this patch adds a new type struct vector_header that documents the constraints on layout of vectors and pseudovectors, and helps optimizing compilers not get fooled by Emacs's type punning. It also adds the macros XSETTYPED_PVECTYPE XSETTYPED_PSEUDOVECTOR, TYPED_PSEUDOVECTORP, for similar reasons. * lisp.h (XVECTOR_SIZE): New convenience macro. All previous uses of XVECTOR (foo)->size replaced to use this macro, to avoid the hassle of writing XVECTOR (foo)->header.size. (XVECTOR_HEADER_SIZE): New macro, for use in XSETPSEUDOVECTOR. (XSETTYPED_PVECTYPE): New macro, specifying the name of the size member. (XSETPVECTYPE): Rewrite in terms of new macro. (XSETPVECTYPESIZE): New macro, specifying both type and size. This is a bit clearer, and further avoids the possibility of undesirable aliasing. (XSETTYPED_PSEUDOVECTOR): New macro, specifying the size. (XSETPSEUDOVECTOR): Rewrite in terms of XSETTYPED_PSEUDOVECTOR and XVECTOR_HEADER_SIZE. (XSETSUBR): Rewrite in terms of XSETTYPED_PSEUDOVECTOR and XSIZE, since Lisp_Subr is a special case (no "next" field). (ASIZE): Rewrite in terms of XVECTOR_SIZE. (struct vector_header): New type. (TYPED_PSEUDOVECTORP): New macro, also specifying the C type of the object, to help avoid aliasing. (PSEUDOVECTORP): Rewrite in terms of TYPED_PSEUDOVECTORP. (SUBRP): Likewise, since Lisp_Subr is a special case. * lisp.h (struct Lisp_Vector, struct Lisp_Char_Table): (struct Lisp_Sub_Char_Table, struct Lisp_Bool_Vector): (struct Lisp_Hash_Table): Combine first two members into a single struct vector_header member. All uses of "size" and "next" members changed to be "header.size" and "header.next". * buffer.h (struct buffer): Likewise. * font.h (struct font_spec, struct font_entity, struct font): Likewise. * frame.h (struct frame): Likewise. * process.h (struct Lisp_Process): Likewise. * termhooks.h (struct terminal): Likewise. * window.c (struct save_window_data, struct saved_window): Likewise. * window.h (struct window): Likewise. * alloc.c (allocate_buffer, Fmake_bool_vector, allocate_pseudovector): Use XSETPVECTYPESIZE, not XSETPVECTYPE, to avoid aliasing problems. * buffer.c (init_buffer_once): Likewise. * lread.c (defsubr): Use XSETTYPED_PVECTYPE, since Lisp_Subr is a special case. * process.c (Fformat_network_address): Use local var for size, for brevity.
Diffstat (limited to 'src/process.h')
-rw-r--r--src/process.h6
1 files changed, 3 insertions, 3 deletions
diff --git a/src/process.h b/src/process.h
index 0348f211bb9..2fca7327a0c 100644
--- a/src/process.h
+++ b/src/process.h
@@ -29,13 +29,13 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
29/* This structure records information about a subprocess 29/* This structure records information about a subprocess
30 or network connection. 30 or network connection.
31 31
32 Every field in this structure except for the first two 32 Every field in this structure except for the header
33 must be a Lisp_Object, for GC's sake. */ 33 must be a Lisp_Object, for GC's sake. */
34 34
35struct Lisp_Process 35struct Lisp_Process
36 { 36 {
37 EMACS_UINT size; 37 struct vector_header header;
38 struct Lisp_Vector *v_next; 38
39 /* Name of subprocess terminal. */ 39 /* Name of subprocess terminal. */
40 Lisp_Object tty_name; 40 Lisp_Object tty_name;
41 /* Name of this process */ 41 /* Name of this process */