diff options
| author | Paul Eggert | 2012-02-22 07:55:46 -0800 |
|---|---|---|
| committer | Paul Eggert | 2012-02-22 07:55:46 -0800 |
| commit | 0edbf0b6fb48eb11d1e28aee898532625455e484 (patch) | |
| tree | eae4f826770b536d3a70e05e3ef5f44071f9bab5 /src | |
| parent | 4d3762f78f77dd919a4725a801b5183c92941622 (diff) | |
| download | emacs-0edbf0b6fb48eb11d1e28aee898532625455e484.tar.gz emacs-0edbf0b6fb48eb11d1e28aee898532625455e484.zip | |
* src/lisp.h: Improve comment about USE_LSB_TAG.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lisp.h | 25 |
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 |