Standardize on VIRT_ADDR_VARIES behavior.
Otherwise, valgrind does not work on some platforms. Problem reported by Andreas Schwab in <http://lists.gnu.org/archive/html/emacs-devel/2011-11/msg00081.html>. * puresize.h (pure, PURE_P): Always behave as if VIRT_ADDR_VARIES is set, removing the need for VIRT_ADDRESS_VARIES. (PURE_P): Use a more-efficient implementation that needs just one comparison, not two: on x86-64 with GCC 4.6.2, this cut down the number of instructions from 6 (xorl, cmpq, jge, xorl, cmpq, setge) to 4 (xorl, subq, cmpq, setbe). * alloc.c (pure): Always extern now, since that's the VIRT_ADDR_VARIES behavior. (PURE_POINTER_P): Use a single comparison, not two, for consistency with the new puresize.h. * lisp.h (PNTR_COMPARISON_TYPE): Remove; no longer needed. * m/ibms390.h, m/intel386.h, m/template.h, s/cygwin.h, s/hpux10-20.h: Remove VIRT_ADDR_VARIES no longer needed. Fixes: debbugs:10042
This commit is contained in:
commit
17e845af73
9 changed files with 25 additions and 54 deletions
|
@ -1,3 +1,23 @@
|
|||
2011-11-20 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
Standardize on VIRT_ADDR_VARIES behavior (Bug#10042).
|
||||
Otherwise, valgrind does not work on some platforms.
|
||||
Problem reported by Andreas Schwab in
|
||||
<http://lists.gnu.org/archive/html/emacs-devel/2011-11/msg00081.html>.
|
||||
* puresize.h (pure, PURE_P): Always behave as if VIRT_ADDR_VARIES
|
||||
is set, removing the need for VIRT_ADDRESS_VARIES.
|
||||
(PURE_P): Use a more-efficient implementation that needs just one
|
||||
comparison, not two: on x86-64 with GCC 4.6.2, this cut down the
|
||||
number of instructions from 6 (xorl, cmpq, jge, xorl, cmpq, setge)
|
||||
to 4 (xorl, subq, cmpq, setbe).
|
||||
* alloc.c (pure): Always extern now, since that's the
|
||||
VIRT_ADDR_VARIES behavior.
|
||||
(PURE_POINTER_P): Use a single comparison, not two, for
|
||||
consistency with the new puresize.h.
|
||||
* lisp.h (PNTR_COMPARISON_TYPE): Remove; no longer needed.
|
||||
* m/ibms390.h, m/intel386.h, m/template.h, s/cygwin.h, s/hpux10-20.h:
|
||||
Remove VIRT_ADDR_VARIES no longer needed.
|
||||
|
||||
2011-11-19 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
* xdisp.c (x_write_glyphs, draw_phys_cursor_glyph)
|
||||
|
|
|
@ -203,9 +203,6 @@ static int malloc_hysteresis;
|
|||
remapping on more recent systems because this is less important
|
||||
nowadays than in the days of small memories and timesharing. */
|
||||
|
||||
#ifndef VIRT_ADDR_VARIES
|
||||
static
|
||||
#endif
|
||||
EMACS_INT pure[(PURESIZE + sizeof (EMACS_INT) - 1) / sizeof (EMACS_INT)] = {1,};
|
||||
#define PUREBEG (char *) pure
|
||||
|
||||
|
@ -222,10 +219,7 @@ static ptrdiff_t pure_bytes_used_before_overflow;
|
|||
/* Value is non-zero if P points into pure space. */
|
||||
|
||||
#define PURE_POINTER_P(P) \
|
||||
(((PNTR_COMPARISON_TYPE) (P) \
|
||||
< (PNTR_COMPARISON_TYPE) ((char *) purebeg + pure_size)) \
|
||||
&& ((PNTR_COMPARISON_TYPE) (P) \
|
||||
>= (PNTR_COMPARISON_TYPE) purebeg))
|
||||
((uintptr_t) (P) - (uintptr_t) purebeg <= pure_size)
|
||||
|
||||
/* Index in pure at which next pure Lisp object will be allocated.. */
|
||||
|
||||
|
|
|
@ -1877,9 +1877,6 @@ typedef struct {
|
|||
CHECK_NATNUM (tmp); \
|
||||
XSETCDR ((x), tmp); \
|
||||
} while (0)
|
||||
|
||||
/* Cast pointers to this type to compare them. */
|
||||
#define PNTR_COMPARISON_TYPE uintptr_t
|
||||
|
||||
/* Define a built-in function for calling from Lisp.
|
||||
`lname' should be the name to give the function in Lisp,
|
||||
|
|
|
@ -17,11 +17,6 @@ GNU General Public License for more details.
|
|||
You should have received a copy of the GNU General Public License
|
||||
along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
|
||||
/* Define VIRT_ADDR_VARIES if the virtual addresses of
|
||||
pure and impure space as loaded can vary, and even their
|
||||
relative order cannot be relied on.
|
||||
|
||||
Otherwise Emacs assumes that text space precedes data space,
|
||||
numerically. */
|
||||
#define VIRT_ADDR_VARIES
|
||||
/* This file is a placeholder -- it does not contain any definitions.
|
||||
At some point we should probably fix this by removing the file
|
||||
and removing all uses of it. */
|
||||
|
|
|
@ -19,7 +19,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
|
||||
|
||||
#ifdef WINDOWSNT
|
||||
#define VIRT_ADDR_VARIES
|
||||
#define DATA_START get_data_start ()
|
||||
#endif
|
||||
|
||||
|
@ -28,4 +27,3 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
/* we cannot get the maximum address for brk */
|
||||
#define ULIMIT_BREAK_VALUE (32*1024*1024)
|
||||
#endif
|
||||
|
||||
|
|
|
@ -21,14 +21,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
does not define it automatically.
|
||||
Ones defined so far include m68k and many others */
|
||||
|
||||
/* Define VIRT_ADDR_VARIES if the virtual addresses of
|
||||
pure and impure space as loaded can vary, and even their
|
||||
relative order cannot be relied on.
|
||||
|
||||
Otherwise Emacs assumes that text space precedes data space,
|
||||
numerically. */
|
||||
#define VIRT_ADDR_VARIES
|
||||
|
||||
/* After adding support for a new machine, modify the large case
|
||||
statement in configure.in to recognize reasonable
|
||||
configuration names, and add a description of the system to
|
||||
|
|
|
@ -75,21 +75,7 @@ extern void pure_write_error (void) NO_RETURN;
|
|||
|
||||
/* Define PURE_P. */
|
||||
|
||||
#ifdef VIRT_ADDR_VARIES
|
||||
/* For machines where text and data can go anywhere
|
||||
in virtual memory. */
|
||||
|
||||
extern EMACS_INT pure[];
|
||||
|
||||
#define PURE_P(obj) \
|
||||
((PNTR_COMPARISON_TYPE) XPNTR (obj) < (PNTR_COMPARISON_TYPE) ((char *) pure + PURESIZE) \
|
||||
&& (PNTR_COMPARISON_TYPE) XPNTR (obj) >= (PNTR_COMPARISON_TYPE) pure)
|
||||
|
||||
#else /* not VIRT_ADDR_VARIES */
|
||||
|
||||
extern char my_edata[];
|
||||
|
||||
#define PURE_P(obj) \
|
||||
((PNTR_COMPARISON_TYPE) XPNTR (obj) < (PNTR_COMPARISON_TYPE) my_edata)
|
||||
|
||||
#endif /* VIRT_ADDRESS_VARIES */
|
||||
((uintptr_t) XPNTR (obj) - (uintptr_t) pure <= PURESIZE)
|
||||
|
|
|
@ -91,9 +91,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
why it needed to be changed. */
|
||||
#define GC_MARK_STACK GC_MAKE_GCPROS_NOOPS
|
||||
|
||||
/* Virtual addresses of pure and impure space can vary, as on Windows. */
|
||||
#define VIRT_ADDR_VARIES
|
||||
|
||||
/* Emacs supplies its own malloc, but glib (part of Gtk+) calls
|
||||
memalign and on Cygwin, that becomes the Cygwin-supplied memalign.
|
||||
As malloc is not the Cygwin malloc, the Cygwin memalign always
|
||||
|
|
|
@ -100,14 +100,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|||
header sections which lose when `static' is defined away, as it is
|
||||
on HP-UX. (You get duplicate symbol errors on linking). */
|
||||
#undef _FILE_OFFSET_BITS
|
||||
|
||||
/* Define VIRT_ADDR_VARIES if the virtual addresses of
|
||||
pure and impure space as loaded can vary, and even their
|
||||
relative order cannot be relied on.
|
||||
|
||||
Otherwise Emacs assumes that text space precedes data space,
|
||||
numerically. */
|
||||
#define VIRT_ADDR_VARIES
|
||||
|
||||
/* The data segment on this machine always starts at address 0x40000000. */
|
||||
#define DATA_SEG_BITS 0x40000000
|
||||
|
|
Loading…
Add table
Reference in a new issue