]> git.eshelyaron.com Git - emacs.git/commitdiff
Standardize on VIRT_ADDR_VARIES behavior; otherwise, valgrind
authorPaul Eggert <eggert@cs.ucla.edu>
Thu, 10 Nov 2011 08:14:27 +0000 (00:14 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Thu, 10 Nov 2011 08:14:27 +0000 (00:14 -0800)
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.

src/ChangeLog
src/alloc.c
src/lisp.h
src/m/ibms390.h
src/m/intel386.h
src/m/template.h
src/puresize.h
src/s/cygwin.h
src/s/hpux10-20.h

index b14d6752bb97094eeef65d335d084f8cd0f569c1..4e56e3c8499fd1eb7ddd16c1305c63c7523094c1 100644 (file)
@@ -1,3 +1,22 @@
+2011-11-10  Paul Eggert  <eggert@cs.ucla.edu>
+
+       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.
+
 2011-11-09  Chong Yidong  <cyd@gnu.org>
 
        * window.c (Fwindow_inside_edges, Fwindow_inside_pixel_edges)
index 985e4b71426324a868477d78d0c044c4eb25f670..639a35c3f36991668d4b35759886fc86f4f1f019 100644 (file)
@@ -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.. */
 
index 46448f7a1fb851f4a6966c2f64f00f5df2ad7348..880de65bf65d84287ccdeeb3a7349628f07f3d7a 100644 (file)
@@ -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
 \f
 /* Define a built-in function for calling from Lisp.
  `lname' should be the name to give the function in Lisp,
index c309035dc5c11159a2620a76cdb86ffc7c4ef20f..7269d416a484e1a75f852eb3d7d564d7c5c7d5fd 100644 (file)
@@ -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.  */
index 16f0645715c2b57534aa6e86d64ab01276e68404..114b7fef9638b6fa65acbd5ba783cbafc4f98a28 100644 (file)
@@ -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
-
index 54fb0da95216cef0601d963a1611a3c42695d38e..38649e8ac6d4c1004f6200b073e6e3da4c6e062f 100644 (file)
@@ -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
index c26c496a757059f80f662c995fb8cba30d32de64..4290c30c68d7c53cbd9d3bc7960b5cde7abc2b52 100644 (file)
@@ -75,21 +75,7 @@ extern void pure_write_error (void) NO_RETURN;
 \f
 /* 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)
index af5308ff7bbbb3185804ea938c5c47ec09d49741..8f5a0ab1fc7999309c9ce12158a6323629de4aa8 100644 (file)
@@ -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
index 1cd91a41b556d12558a8b8fbf5f64ae0b1f87df0..98bee64eb0897dcb79112b51f9975fcc3b04222b 100644 (file)
@@ -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
 \f
 /* The data segment on this machine always starts at address 0x40000000.  */
 #define DATA_SEG_BITS 0x40000000