/
valgrind.patch
123 lines (114 loc) · 3.05 KB
/
valgrind.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
Index: Makefile.in
===================================================================
--- Makefile.in (revision 6439)
+++ Makefile.in (working copy)
@@ -34,7 +34,7 @@
empty =
OUTFLAG = @OUTFLAG@$(empty)
-CFLAGS = @CFLAGS@ @XCFLAGS@ @ARCH_FLAG@
+CFLAGS = @CFLAGS@ @XCFLAGS@ @ARCH_FLAG@ @VALGRIND_CFLAGS@
CPPFLAGS = -I. -I$(srcdir) @CPPFLAGS@
LDFLAGS = @STATIC@ $(CFLAGS) @LDFLAGS@
EXTLDFLAGS =
Index: configure.in
===================================================================
--- configure.in (revision 6439)
+++ configure.in (working copy)
@@ -895,6 +895,22 @@
fi
fi
+AC_ARG_ENABLE(valgrind,
+ [ --enable-valgrind use valgrind support],
+ [want_valgrind=$enableval], [want_valgrind=auto])
+
+if test x"$want_valgrind" != xno; then
+ AC_CHECK_HEADERS(valgrind/memcheck.h, have_valgrind=yes, have_valgrind=no)
+ if test x"$have_valgrind" = xyes; then
+ AC_DEFINE(HAVE_VALGRIND)
+ VALGRIND_CFLAGS="";
+ elif test x"$want_valgrind" = xyes -a x"$have_valgrind" = xno; then
+ AC_MSG_ERROR(valgrind support requested but valgrind not found)
+ else
+ VALGRIND_CFLAGS="";
+ fi
+fi
+
dnl default value for $KANJI
DEFAULT_KCODE="KCODE_NONE"
@@ -1504,6 +1520,7 @@
esac
AC_SUBST(XCFLAGS)dnl
+AC_SUBST(VALGRIND_CFLAGS)dnl
AC_SUBST(XLDFLAGS)dnl
AC_SUBST(LIBRUBY_LDSHARED)
AC_SUBST(LIBRUBY_DLDFLAGS)
Index: eval.c
===================================================================
--- eval.c (revision 6439)
+++ eval.c (working copy)
@@ -28,6 +28,12 @@
#define EXIT_FAILURE 1
#endif
+#ifdef HAVE_VALGRIND
+#include <valgrind/memcheck.h>
+#else
+#define VALGRIND_MAKE_MEM_DEFINED(p, n) /* empty */
+#endif
+
#include <stdio.h>
#include "st.h"
@@ -5225,6 +5231,9 @@
int pcall;
{
ruby_current_node = lhs;
+
+ VALGRIND_MAKE_MEM_DEFINED(&val, sizeof(val));
+
if (val == Qundef) {
rb_warning("assigning void value");
val = Qnil;
Index: gc.c
===================================================================
--- gc.c (revision 6439)
+++ gc.c (working copy)
@@ -30,6 +30,12 @@
#include <sys/resource.h>
#endif
+#ifdef HAVE_VALGRIND
+#include <valgrind/memcheck.h>
+#else
+#define VALGRIND_MAKE_MEM_DEFINED(p, n) /* empty */
+#endif
+
#if defined _WIN32 || defined __CYGWIN__
#include <windows.h>
#endif
@@ -93,6 +99,9 @@
{
void *mem;
+ VALGRIND_MAKE_MEM_DEFINED(&malloc_increase, sizeof(malloc_increase));
+ VALGRIND_MAKE_MEM_DEFINED(&malloc_limit, sizeof(malloc_limit));
+
if (size < 0) {
rb_raise(rb_eNoMemError, "negative allocation size (or too big)");
}
@@ -623,6 +632,9 @@
register long n;
{
VALUE v;
+
+ VALGRIND_MAKE_MEM_DEFINED(x, sizeof(*x) * n);
+
while (n--) {
v = *x;
if (is_pointer_to_heap((void *)v)) {
@@ -713,7 +725,10 @@
{
register RVALUE *obj;
+ VALGRIND_MAKE_MEM_DEFINED(&ptr, sizeof(ptr));
obj = RANY(ptr);
+ VALGRIND_MAKE_MEM_DEFINED(obj, sizeof(*obj));
+
if (rb_special_const_p(ptr)) return; /* special const not marked */
if (obj->as.basic.flags == 0) return; /* free cell */
if (obj->as.basic.flags & FL_MARK) return; /* already marked */