summaryrefslogtreecommitdiff
path: root/src/alloc.c
diff options
context:
space:
mode:
authorDaniel Colascione <dancol@dancol.org>2013-09-22 18:34:52 -0800
committerDaniel Colascione <dancol@dancol.org>2013-09-22 18:34:52 -0800
commita84683fdd5dcb629a59807e78c413e21f21a186d (patch)
tree785edb9e32d30a7e7e7f48598aac77e98554169c /src/alloc.c
parentfb83ea63a5db0fe6c20667532d1019a58d2fc1fd (diff)
downloademacs-a84683fdd5dcb629a59807e78c413e21f21a186d.tar.gz
Tell valgrind about conservative GC regions and suppress spurious
warings. * alloc.c (USE_VALGRIND): New macro; on by default when ENABLE_CHECKING. (mark_maybe_object,mark_maybe_pointer) [USE_VALGRIND]: Mark conservatively-scanned regions valid for valgrind purposes. (valgrind_p) [USE_VALGRIND]: New variable. (init_alloc) [USE_VALGRIND]: Initialize valgrind_p.
Diffstat (limited to 'src/alloc.c')
-rw-r--r--src/alloc.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/alloc.c b/src/alloc.c
index 847b3c88bbe..564faa18aa8 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -45,6 +45,18 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#include <verify.h>
+#if (defined ENABLE_CHECKING && \
+ defined HAVE_VALGRIND_VALGRIND_H && \
+ !defined USE_VALGRIND)
+# define USE_VALGRIND 1
+#endif
+
+#if USE_VALGRIND
+#include <valgrind/valgrind.h>
+#include <valgrind/memcheck.h>
+static int valgrind_p;
+#endif
+
/* GC_CHECK_MARKED_OBJECTS means do sanity checks on allocated objects.
Doable only if GC_MARK_STACK. */
#if ! GC_MARK_STACK
@@ -4327,6 +4339,11 @@ mark_maybe_object (Lisp_Object obj)
void *po;
struct mem_node *m;
+#if USE_VALGRIND
+ if (valgrind_p)
+ VALGRIND_MAKE_MEM_DEFINED (&obj, sizeof (obj));
+#endif
+
if (INTEGERP (obj))
return;
@@ -4395,6 +4412,11 @@ mark_maybe_pointer (void *p)
{
struct mem_node *m;
+#if USE_VALGRIND
+ if (valgrind_p)
+ VALGRIND_MAKE_MEM_DEFINED (&p, sizeof (p));
+#endif
+
/* Quickly rule out some values which can't point to Lisp data.
USE_LSB_TAG needs Lisp data to be aligned on multiples of GCALIGNMENT.
Otherwise, assume that Lisp data is aligned on even addresses. */
@@ -6643,6 +6665,10 @@ init_alloc (void)
#endif
Vgc_elapsed = make_float (0.0);
gcs_done = 0;
+
+#if USE_VALGRIND
+ valgrind_p = RUNNING_ON_VALGRIND;
+#endif
}
void