aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert2012-02-22 07:55:46 -0800
committerPaul Eggert2012-02-22 07:55:46 -0800
commit0edbf0b6fb48eb11d1e28aee898532625455e484 (patch)
treeeae4f826770b536d3a70e05e3ef5f44071f9bab5 /src
parent4d3762f78f77dd919a4725a801b5183c92941622 (diff)
downloademacs-0edbf0b6fb48eb11d1e28aee898532625455e484.tar.gz
emacs-0edbf0b6fb48eb11d1e28aee898532625455e484.zip
* src/lisp.h: Improve comment about USE_LSB_TAG.
Diffstat (limited to 'src')
-rw-r--r--src/lisp.h25
1 files changed, 19 insertions, 6 deletions
diff --git a/src/lisp.h b/src/lisp.h
index 8bfd7071e5f..375d376702b 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -195,12 +195,25 @@ extern int suppress_checking EXTERNALLY_VISIBLE;
195 || defined DARWIN_OS || defined __sun) 195 || defined DARWIN_OS || defined __sun)
196/* We also need to be able to specify mult-of-8 alignment on static vars. */ 196/* We also need to be able to specify mult-of-8 alignment on static vars. */
197# if defined DECL_ALIGN 197# if defined DECL_ALIGN
198/* mark_maybe_object assumes that EMACS_INT values are contiguous, 198/* On hosts where VALBITS is greater than the pointer width in bits,
199 but this is not true on some hosts where EMACS_INT is wider than a pointer, 199 USE_LSB_TAG is:
200 as they may allocate the halves of an EMACS_INT separately. 200
201 On these hosts USE_LSB_TAG is not needed because the top bits of an 201 a. unnecessary, because the top bits of an EMACS_INT are unused,
202 EMACS_INT are unused, so define USE_LSB_TAG only on hosts where it 202
203 might be useful. */ 203 b. slower, because it typically requires extra masking, and
204
205 c. harmful, because it can create Lisp_Object values that are so scrambled
206 that mark_maybe_object cannot decipher them. mark_maybe_object assumes
207 that EMACS_INT values are contiguous, but a host where EMACS_INT is
208 wider than a pointer might allocate the top half of an EMACS_INT in
209 (say) a 32-bit word on the stack, putting the bottom half in a 32-bit
210 register that is saved elsewhere in a jmp_buf. When this happens,
211 since USE_LSB_TAG is not defined the bottom half alone is a valid
212 pointer that mark_maybe_pointer can follow; but if USE_LSB_TAG were
213 defined, the bottom half would not be a valid pointer and neither
214 mark_maybe_object nor mark_maybe_pointer would follow it.
215
216 So, define USE_LSB_TAG only on hosts where it might be useful. */
204# if UINTPTR_MAX >> VALBITS != 0 217# if UINTPTR_MAX >> VALBITS != 0
205# define USE_LSB_TAG 218# define USE_LSB_TAG
206# endif 219# endif