You can subscribe to this list here.
| 2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
(122) |
Nov
(152) |
Dec
(69) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2003 |
Jan
(6) |
Feb
(25) |
Mar
(73) |
Apr
(82) |
May
(24) |
Jun
(25) |
Jul
(10) |
Aug
(11) |
Sep
(10) |
Oct
(54) |
Nov
(203) |
Dec
(182) |
| 2004 |
Jan
(307) |
Feb
(305) |
Mar
(430) |
Apr
(312) |
May
(187) |
Jun
(342) |
Jul
(487) |
Aug
(637) |
Sep
(336) |
Oct
(373) |
Nov
(441) |
Dec
(210) |
| 2005 |
Jan
(385) |
Feb
(480) |
Mar
(636) |
Apr
(544) |
May
(679) |
Jun
(625) |
Jul
(810) |
Aug
(838) |
Sep
(634) |
Oct
(521) |
Nov
(965) |
Dec
(543) |
| 2006 |
Jan
(494) |
Feb
(431) |
Mar
(546) |
Apr
(411) |
May
(406) |
Jun
(322) |
Jul
(256) |
Aug
(401) |
Sep
(345) |
Oct
(542) |
Nov
(308) |
Dec
(481) |
| 2007 |
Jan
(427) |
Feb
(326) |
Mar
(367) |
Apr
(255) |
May
(244) |
Jun
(204) |
Jul
(223) |
Aug
(231) |
Sep
(354) |
Oct
(374) |
Nov
(497) |
Dec
(362) |
| 2008 |
Jan
(322) |
Feb
(482) |
Mar
(658) |
Apr
(422) |
May
(476) |
Jun
(396) |
Jul
(455) |
Aug
(267) |
Sep
(280) |
Oct
(253) |
Nov
(232) |
Dec
(304) |
| 2009 |
Jan
(486) |
Feb
(470) |
Mar
(458) |
Apr
(423) |
May
(696) |
Jun
(461) |
Jul
(551) |
Aug
(575) |
Sep
(134) |
Oct
(110) |
Nov
(157) |
Dec
(102) |
| 2010 |
Jan
(226) |
Feb
(86) |
Mar
(147) |
Apr
(117) |
May
(107) |
Jun
(203) |
Jul
(193) |
Aug
(238) |
Sep
(300) |
Oct
(246) |
Nov
(23) |
Dec
(75) |
| 2011 |
Jan
(133) |
Feb
(195) |
Mar
(315) |
Apr
(200) |
May
(267) |
Jun
(293) |
Jul
(353) |
Aug
(237) |
Sep
(278) |
Oct
(611) |
Nov
(274) |
Dec
(260) |
| 2012 |
Jan
(303) |
Feb
(391) |
Mar
(417) |
Apr
(441) |
May
(488) |
Jun
(655) |
Jul
(590) |
Aug
(610) |
Sep
(526) |
Oct
(478) |
Nov
(359) |
Dec
(372) |
| 2013 |
Jan
(467) |
Feb
(226) |
Mar
(391) |
Apr
(281) |
May
(299) |
Jun
(252) |
Jul
(311) |
Aug
(352) |
Sep
(481) |
Oct
(571) |
Nov
(222) |
Dec
(231) |
| 2014 |
Jan
(185) |
Feb
(329) |
Mar
(245) |
Apr
(238) |
May
(281) |
Jun
(399) |
Jul
(382) |
Aug
(500) |
Sep
(579) |
Oct
(435) |
Nov
(487) |
Dec
(256) |
| 2015 |
Jan
(338) |
Feb
(357) |
Mar
(330) |
Apr
(294) |
May
(191) |
Jun
(108) |
Jul
(142) |
Aug
(261) |
Sep
(190) |
Oct
(54) |
Nov
(83) |
Dec
(22) |
| 2016 |
Jan
(49) |
Feb
(89) |
Mar
(33) |
Apr
(50) |
May
(27) |
Jun
(34) |
Jul
(53) |
Aug
(53) |
Sep
(98) |
Oct
(206) |
Nov
(93) |
Dec
(53) |
| 2017 |
Jan
(65) |
Feb
(82) |
Mar
(102) |
Apr
(86) |
May
(187) |
Jun
(67) |
Jul
(23) |
Aug
(93) |
Sep
(65) |
Oct
(45) |
Nov
(35) |
Dec
(17) |
| 2018 |
Jan
(26) |
Feb
(35) |
Mar
(38) |
Apr
(32) |
May
(8) |
Jun
(43) |
Jul
(27) |
Aug
(30) |
Sep
(43) |
Oct
(42) |
Nov
(38) |
Dec
(67) |
| 2019 |
Jan
(32) |
Feb
(37) |
Mar
(53) |
Apr
(64) |
May
(49) |
Jun
(18) |
Jul
(14) |
Aug
(53) |
Sep
(25) |
Oct
(30) |
Nov
(49) |
Dec
(31) |
| 2020 |
Jan
(87) |
Feb
(45) |
Mar
(37) |
Apr
(51) |
May
(99) |
Jun
(36) |
Jul
(11) |
Aug
(14) |
Sep
(20) |
Oct
(24) |
Nov
(40) |
Dec
(23) |
| 2021 |
Jan
(14) |
Feb
(53) |
Mar
(85) |
Apr
(15) |
May
(19) |
Jun
(3) |
Jul
(14) |
Aug
(1) |
Sep
(57) |
Oct
(73) |
Nov
(56) |
Dec
(22) |
| 2022 |
Jan
(3) |
Feb
(22) |
Mar
(6) |
Apr
(55) |
May
(46) |
Jun
(39) |
Jul
(15) |
Aug
(9) |
Sep
(11) |
Oct
(34) |
Nov
(20) |
Dec
(36) |
| 2023 |
Jan
(79) |
Feb
(41) |
Mar
(99) |
Apr
(169) |
May
(48) |
Jun
(16) |
Jul
(16) |
Aug
(57) |
Sep
(19) |
Oct
|
Nov
|
Dec
|
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
|
1
(13) |
2
(33) |
3
(25) |
4
(22) |
5
(22) |
6
(21) |
7
(19) |
|
8
(29) |
9
(34) |
10
(29) |
11
(37) |
12
(36) |
13
(28) |
14
(25) |
|
15
(28) |
16
(23) |
17
(36) |
18
(21) |
19
(12) |
20
(14) |
21
(10) |
|
22
(7) |
23
(15) |
24
(41) |
25
(15) |
26
(9) |
27
(7) |
28
(6) |
|
29
(16) |
30
(24) |
31
(22) |
|
|
|
|
|
From: Jeremy F. <je...@go...> - 2005-05-19 23:08:52
|
Nicholas Nethercote wrote:
> Currently we have two implementations of the sema stuff. One is
> futex-based and one uses pipes. AIUI, the futex one is conceptually
> nicer but in practice there's no noticeable difference in speed, and
> they're similar amounts of code. The futex one is not being used --
> it's all #ifdef'd out.
>
> We're not going to be able to switch completely to the futex approach
> so long as we support 2.4 kernels, which I imagine will be for quite
> some time yet. Also, other OSes like the BSDs don't have futexes.
>
> It doesn't make much sense to me to have two implementations of
> something, with one slowly bitrotting because the preprocessor ignores
> it. What do people think about removing the futex implementation?
There's no strong reason to keep it, but it's nice to have multiple
implementations of the semaphore so that the fact that the current one
is implemented with a pipe doesn't become part of the interface. Other
systems will want other synchronization primitives; pipes are fairly
universal, but not necessarily efficient (though they're pretty close to
optimal on Linux).
J
|
|
From: <sv...@va...> - 2005-05-19 10:54:05
|
Author: sewardj
Date: 2005-05-19 11:54:01 +0100 (Thu, 19 May 2005)
New Revision: 3776
Modified:
trunk/coregrind/m_mallocfree.c
Log:
Small but critical performance fix from Pete Moceyunas: give
each small allocation size its own list. Otherwise there can
be very long searches along lists looking for a block of the
right size.
Modified: trunk/coregrind/m_mallocfree.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/m_mallocfree.c 2005-05-19 07:32:05 UTC (rev 3775)
+++ trunk/coregrind/m_mallocfree.c 2005-05-19 10:54:01 UTC (rev 3776)
@@ -44,7 +44,7 @@
/*--- Main types ---*/
/*------------------------------------------------------------*/
=20
-#define N_MALLOC_LISTS 16 // do not change this
+#define N_MALLOC_LISTS 18 // do not change this
=20
// The amount you can ask for is limited only by sizeof(SizeT)...
#define MAX_PSZB (~((SizeT)0x0))
@@ -533,22 +533,27 @@
{
vg_assert(0 =3D=3D pszB % VG_MIN_MALLOC_SZB);
pszB /=3D VG_MIN_MALLOC_SZB;
- if (pszB <=3D 2) return 0;
- if (pszB <=3D 3) return 1;
- if (pszB <=3D 4) return 2;
- if (pszB <=3D 5) return 3;
- if (pszB <=3D 6) return 4;
- if (pszB <=3D 7) return 5;
- if (pszB <=3D 8) return 6;
- if (pszB <=3D 9) return 7;
- if (pszB <=3D 10) return 8;
- if (pszB <=3D 11) return 9;
- if (pszB <=3D 12) return 10;
- if (pszB <=3D 16) return 11;
- if (pszB <=3D 32) return 12;
- if (pszB <=3D 64) return 13;
- if (pszB <=3D 128) return 14;
- return 15;
+ switch (pszB) {
+ case 0: return 0;
+ case 1: return 1;
+ case 2: return 2;
+ case 3: return 3;
+ case 4: return 4;
+ case 5: return 5;
+ case 6: return 6;
+ case 7: return 7;
+ case 8: return 8;
+ case 9: return 9;
+ case 10: return 10;
+ case 11: return 11;
+ case 12: return 12;
+ default: break;
+ }
+ if (pszB <=3D 16) return 13;
+ if (pszB <=3D 32) return 14;
+ if (pszB <=3D 64) return 15;
+ if (pszB <=3D 128) return 16;
+ return 17;
}
=20
// What is the minimum payload size for a given list?
|
|
From: <sv...@va...> - 2005-05-19 07:32:18
|
Author: tom
Date: 2005-05-19 08:32:05 +0100 (Thu, 19 May 2005)
New Revision: 3775
Modified:
trunk/coregrind/m_syscalls/syscalls-amd64-linux.c
Log:
Don't try and set up the thread state members that have been removed
on amd64 systems.
Modified: trunk/coregrind/m_syscalls/syscalls-amd64-linux.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/m_syscalls/syscalls-amd64-linux.c 2005-05-19 00:36:20=
UTC (rev 3774)
+++ trunk/coregrind/m_syscalls/syscalls-amd64-linux.c 2005-05-19 07:32:05=
UTC (rev 3775)
@@ -363,9 +363,6 @@
ctst->arch.vex.guest_RSP =3D rsp;
=20
ctst->os_state.parent =3D ptid;
- ctst->os_state.clone_flags =3D flags;
- ctst->os_state.parent_tidptr =3D parent_tidptr;
- ctst->os_state.child_tidptr =3D child_tidptr;
=20
/* inherit signal mask */
ctst->sig_mask =3D ptst->sig_mask;
|
|
From: <js...@ac...> - 2005-05-19 03:02:35
|
Nightly build on phoenix ( SuSE 9.1 ) started at 2005-05-19 03:50:01 BST Checking out source tree ... done Configuring ... done Building ... done Running regression tests ... done Last 20 lines of log.verbose follow insn_mmx: valgrind ./insn_mmx insn_mmxext: (skipping, prereq failed: ../../../tests/cputest x86-mmxext) insn_sse: valgrind ./insn_sse insn_sse2: (skipping, prereq failed: ../../../tests/cputest x86-sse2) int: valgrind ./int pushpopseg: valgrind ./pushpopseg rcl_assert: valgrind ./rcl_assert seg_override: valgrind ./seg_override -- Finished tests in none/tests/x86 ------------------------------------ yield: valgrind ./yield -- Finished tests in none/tests ---------------------------------------- == 201 tests, 5 stderr failures, 0 stdout failures ================= memcheck/tests/pth_once (stderr) memcheck/tests/scalar (stderr) memcheck/tests/threadederrno (stderr) memcheck/tests/writev (stderr) corecheck/tests/fdleak_fcntl (stderr) make: *** [regtest] Error 1 |
|
From: Tom H. <to...@co...> - 2005-05-19 02:36:37
|
Nightly build on dunsmere ( athlon, Fedora Core 3 ) started at 2005-05-19 03:30:03 BST Checking out vex source tree ... done Building vex ... done Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 175 tests, 13 stderr failures, 3 stdout failures ================= memcheck/tests/execve (stderr) memcheck/tests/execve2 (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/x86/scalar_supp (stderr) corecheck/tests/fdleak_cmsg (stderr) corecheck/tests/fdleak_creat (stderr) corecheck/tests/fdleak_dup (stderr) corecheck/tests/fdleak_dup2 (stderr) corecheck/tests/fdleak_fcntl (stderr) corecheck/tests/fdleak_open (stderr) none/tests/cmdline1 (stdout) none/tests/cmdline2 (stdout) none/tests/faultstatus (stderr) none/tests/selfrun (stdout) none/tests/selfrun (stderr) none/tests/x86/int (stderr) |
|
From: Tom H. <th...@cy...> - 2005-05-19 02:30:43
|
Nightly build on audi ( i686, Red Hat 9 ) started at 2005-05-19 03:25:02 BST Checking out vex source tree ... done Building vex ... done Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 174 tests, 3 stderr failures, 2 stdout failures ================= corecheck/tests/fdleak_cmsg (stderr) none/tests/cmdline1 (stdout) none/tests/cmdline2 (stdout) none/tests/faultstatus (stderr) none/tests/x86/int (stderr) |
|
From: Tom H. <th...@cy...> - 2005-05-19 02:25:52
|
Nightly build on ginetta ( i686, Red Hat 8.0 ) started at 2005-05-19 03:20:02 BST Checking out vex source tree ... done Building vex ... done Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 173 tests, 3 stderr failures, 2 stdout failures ================= corecheck/tests/fdleak_cmsg (stderr) none/tests/cmdline1 (stdout) none/tests/cmdline2 (stdout) none/tests/faultstatus (stderr) none/tests/x86/int (stderr) |
|
From: Tom H. <th...@cy...> - 2005-05-19 02:21:03
|
Nightly build on alvis ( i686, Red Hat 7.3 ) started at 2005-05-19 03:15:02 BST Checking out vex source tree ... done Building vex ... done Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 173 tests, 12 stderr failures, 2 stdout failures ================= memcheck/tests/addressable (stderr) memcheck/tests/describe-block (stderr) memcheck/tests/leak-0 (stderr) memcheck/tests/leak-cycle (stderr) memcheck/tests/leak-regroot (stderr) memcheck/tests/leak-tree (stderr) memcheck/tests/match-overrun (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/vgtest_ume (stderr) corecheck/tests/fdleak_cmsg (stderr) none/tests/cmdline1 (stdout) none/tests/cmdline2 (stdout) none/tests/faultstatus (stderr) none/tests/x86/int (stderr) |
|
From: Tom H. <th...@cy...> - 2005-05-19 02:11:18
|
Nightly build on dellow ( x86_64, Fedora Core 3 ) started at 2005-05-19 03:10:04 BST Checking out vex source tree ... done Building vex ... done Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... failed Last 20 lines of log.verbose follow Making all in m_syscalls make[3]: Entering directory `/tmp/valgrind.22689/valgrind/coregrind/m_syscalls' gcc -I../../coregrind -I../.. -I../../coregrind/amd64 -I../../coregrind/linux -I../../coregrind/amd64-linux -I../../include -I/tmp/valgrind.22689/vex/pub -DVGA_amd64=1 -DVGO_linux=1 -DVGP_amd64_linux=1 -m64 -Wa,-gstabs -Wno-long-long -c syscall-amd64-linux.S if gcc -DHAVE_CONFIG_H -I. -I. -I../.. -I../../coregrind -I../.. -I../../coregrind/amd64 -I../../coregrind/linux -I../../coregrind/amd64-linux -I../../include -I/tmp/valgrind.22689/vex/pub -DVGA_amd64=1 -DVGO_linux=1 -DVGP_amd64_linux=1 -fpie -m64 -fomit-frame-pointer -DELFSZ=64 -Wmissing-prototypes -Winline -Wall -Wshadow -O -g -Wno-long-long -MT syscalls.o -MD -MP -MF ".deps/syscalls.Tpo" -c -o syscalls.o syscalls.c; \ then mv -f ".deps/syscalls.Tpo" ".deps/syscalls.Po"; else rm -f ".deps/syscalls.Tpo"; exit 1; fi if gcc -DHAVE_CONFIG_H -I. -I. -I../.. -I../../coregrind -I../.. -I../../coregrind/amd64 -I../../coregrind/linux -I../../coregrind/amd64-linux -I../../include -I/tmp/valgrind.22689/vex/pub -DVGA_amd64=1 -DVGO_linux=1 -DVGP_amd64_linux=1 -fpie -m64 -fomit-frame-pointer -DELFSZ=64 -Wmissing-prototypes -Winline -Wall -Wshadow -O -g -Wno-long-long -MT syscalls-linux.o -MD -MP -MF ".deps/syscalls-linux.Tpo" -c -o syscalls-linux.o syscalls-linux.c; \ then mv -f ".deps/syscalls-linux.Tpo" ".deps/syscalls-linux.Po"; else rm -f ".deps/syscalls-linux.Tpo"; exit 1; fi if gcc -DHAVE_CONFIG_H -I. -I. -I../.. -I../../coregrind -I../.. -I../../coregrind/amd64 -I../../coregrind/linux -I../../coregrind/amd64-linux -I../../include -I/tmp/valgrind.22689/vex/pub -DVGA_amd64=1 -DVGO_linux=1 -DVGP_amd64_linux=1 -fpie -m64 -fomit-frame-pointer -DELFSZ=64 -Wmissing-prototypes -Winline -Wall -Wshadow -O -g -Wno-long-long -MT syscalls-amd64-linux.o -MD -MP -MF ".deps/syscalls-amd64-linux.Tpo" -c -o syscalls-amd64-linux.o syscalls-amd64-linux.c; \ then mv -f ".deps/syscalls-amd64-linux.Tpo" ".deps/syscalls-amd64-linux.Po"; else rm -f ".deps/syscalls-amd64-linux.Tpo"; exit 1; fi syscalls-amd64-linux.c: In function `do_clone': syscalls-amd64-linux.c:366: error: structure has no member named `clone_flags' syscalls-amd64-linux.c:367: error: structure has no member named `parent_tidptr' syscalls-amd64-linux.c:368: error: structure has no member named `child_tidptr' make[3]: *** [syscalls-amd64-linux.o] Error 1 make[3]: Leaving directory `/tmp/valgrind.22689/valgrind/coregrind/m_syscalls' make[2]: *** [all-recursive] Error 1 make[2]: Leaving directory `/tmp/valgrind.22689/valgrind/coregrind' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/tmp/valgrind.22689/valgrind' make: *** [all] Error 2 |
|
From: Tom H. <th...@cy...> - 2005-05-19 02:01:34
|
Nightly build on gill ( x86_64, Fedora Core 2 ) started at 2005-05-19 03:00:02 BST Checking out vex source tree ... done Building vex ... done Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... failed Last 20 lines of log.verbose follow Making all in m_syscalls make[3]: Entering directory `/tmp/valgrind.19821/valgrind/coregrind/m_syscalls' gcc -I../../coregrind -I../.. -I../../coregrind/amd64 -I../../coregrind/linux -I../../coregrind/amd64-linux -I../../include -I/tmp/valgrind.19821/vex/pub -DVGA_amd64=1 -DVGO_linux=1 -DVGP_amd64_linux=1 -m64 -Wa,-gstabs -Wno-long-long -c syscall-amd64-linux.S if gcc -DHAVE_CONFIG_H -I. -I. -I../.. -I../../coregrind -I../.. -I../../coregrind/amd64 -I../../coregrind/linux -I../../coregrind/amd64-linux -I../../include -I/tmp/valgrind.19821/vex/pub -DVGA_amd64=1 -DVGO_linux=1 -DVGP_amd64_linux=1 -fpie -m64 -fomit-frame-pointer -DELFSZ=64 -Wmissing-prototypes -Winline -Wall -Wshadow -O -g -Wno-long-long -MT syscalls.o -MD -MP -MF ".deps/syscalls.Tpo" -c -o syscalls.o syscalls.c; \ then mv -f ".deps/syscalls.Tpo" ".deps/syscalls.Po"; else rm -f ".deps/syscalls.Tpo"; exit 1; fi if gcc -DHAVE_CONFIG_H -I. -I. -I../.. -I../../coregrind -I../.. -I../../coregrind/amd64 -I../../coregrind/linux -I../../coregrind/amd64-linux -I../../include -I/tmp/valgrind.19821/vex/pub -DVGA_amd64=1 -DVGO_linux=1 -DVGP_amd64_linux=1 -fpie -m64 -fomit-frame-pointer -DELFSZ=64 -Wmissing-prototypes -Winline -Wall -Wshadow -O -g -Wno-long-long -MT syscalls-linux.o -MD -MP -MF ".deps/syscalls-linux.Tpo" -c -o syscalls-linux.o syscalls-linux.c; \ then mv -f ".deps/syscalls-linux.Tpo" ".deps/syscalls-linux.Po"; else rm -f ".deps/syscalls-linux.Tpo"; exit 1; fi if gcc -DHAVE_CONFIG_H -I. -I. -I../.. -I../../coregrind -I../.. -I../../coregrind/amd64 -I../../coregrind/linux -I../../coregrind/amd64-linux -I../../include -I/tmp/valgrind.19821/vex/pub -DVGA_amd64=1 -DVGO_linux=1 -DVGP_amd64_linux=1 -fpie -m64 -fomit-frame-pointer -DELFSZ=64 -Wmissing-prototypes -Winline -Wall -Wshadow -O -g -Wno-long-long -MT syscalls-amd64-linux.o -MD -MP -MF ".deps/syscalls-amd64-linux.Tpo" -c -o syscalls-amd64-linux.o syscalls-amd64-linux.c; \ then mv -f ".deps/syscalls-amd64-linux.Tpo" ".deps/syscalls-amd64-linux.Po"; else rm -f ".deps/syscalls-amd64-linux.Tpo"; exit 1; fi syscalls-amd64-linux.c: In function `do_clone': syscalls-amd64-linux.c:366: error: structure has no member named `clone_flags' syscalls-amd64-linux.c:367: error: structure has no member named `parent_tidptr' syscalls-amd64-linux.c:368: error: structure has no member named `child_tidptr' make[3]: *** [syscalls-amd64-linux.o] Error 1 make[3]: Leaving directory `/tmp/valgrind.19821/valgrind/coregrind/m_syscalls' make[2]: *** [all-recursive] Error 1 make[2]: Leaving directory `/tmp/valgrind.19821/valgrind/coregrind' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/tmp/valgrind.19821/valgrind' make: *** [all] Error 2 |
|
From: <sv...@va...> - 2005-05-19 00:36:24
|
Author: njn
Date: 2005-05-19 01:36:20 +0100 (Thu, 19 May 2005)
New Revision: 3774
Modified:
trunk/coregrind/core.h
Log:
Remove dead field.
Modified: trunk/coregrind/core.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/core.h 2005-05-19 00:25:45 UTC (rev 3773)
+++ trunk/coregrind/core.h 2005-05-19 00:36:20 UTC (rev 3774)
@@ -247,10 +247,6 @@
be set while Thread is in VgTs_WaitSys. */
Int syscallno;
=20
- /* A value the Tool wants to pass from its pre-syscall to its
- post-syscall function. */
- void *tool_pre_syscall_value;
-
/* Client stacks. When a thread slot is freed, we don't deallocate i=
ts
stack; we just leave it lying around for the next use of the
slot. If the next use of the slot requires a larger stack,
|
|
From: <sv...@va...> - 2005-05-19 00:25:53
|
Author: sewardj
Date: 2005-05-19 01:25:45 +0100 (Thu, 19 May 2005)
New Revision: 3773
Modified:
trunk/coregrind/m_errormgr.c
trunk/coregrind/m_options.c
trunk/coregrind/m_stacktrace.c
trunk/coregrind/m_translate.c
trunk/coregrind/vg_main.c
trunk/coregrind/vg_messages.c
trunk/coregrind/vg_symtab2.c
trunk/include/pub_tool_options.h
trunk/memcheck/mac_leakcheck.c
trunk/memcheck/mac_malloc_wrappers.c
trunk/memcheck/mac_shared.c
trunk/memcheck/mc_main.c
Log:
First pass at adding ability for Memcheck to print all output in XML
form. The relevant flag is --xml=3Dyes. Currently this only works with
Memcheck.
Specifying this flag fixes various other options relating to verbosity
and behaviour of the leak checker, so that the resulting output is in
a relatively fixed form suitable for parsing by GUIs.
Still to do:
* Add mechanism to show error counts
* Add regression test
* Document the resulting format
Modified: trunk/coregrind/m_errormgr.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/m_errormgr.c 2005-05-18 22:56:00 UTC (rev 3772)
+++ trunk/coregrind/m_errormgr.c 2005-05-19 00:25:45 UTC (rev 3773)
@@ -251,13 +251,20 @@
=20
static void pp_Error ( Error* err, Bool printCount )
{
- if (printCount)
- VG_(message)(Vg_UserMsg, "Observed %d times:", err->count );
- if (err->tid > 0 && err->tid !=3D last_tid_printed) {
- VG_(message)(Vg_UserMsg, "Thread %d:", err->tid );
- last_tid_printed =3D err->tid;
+ if (VG_(clo_xml)) {
+ VG_(message)(Vg_UserMsg, "<error>");
+ VG_(message)(Vg_UserMsg, " <tid>%d</tid>", err->tid);
}
=20
+ if (!VG_(clo_xml)) {
+ if (printCount)
+ VG_(message)(Vg_UserMsg, "Observed %d times:", err->count );
+ if (err->tid > 0 && err->tid !=3D last_tid_printed) {
+ VG_(message)(Vg_UserMsg, "Thread %d:", err->tid );
+ last_tid_printed =3D err->tid;
+ }
+ }
+
switch (err->ekind) {
// case ThreadErr:
// case MutexErr:
@@ -274,6 +281,9 @@
VG_(tool_panic)("unhandled error type");
}
}
+
+ if (VG_(clo_xml))
+ VG_(message)(Vg_UserMsg, "</error>");
}
=20
/* Figure out if we want to perform a given action for this error, possi=
bly
@@ -629,6 +639,31 @@
/*--- Exported fns ---*/
/*------------------------------------------------------------*/
=20
+/* Show the used suppressions. Returns False if no suppression
+ got used. */
+static Bool show_used_suppressions ( void )
+{
+ Supp *su;
+ Bool any_supp;
+
+ any_supp =3D False;
+ for (su =3D suppressions; su !=3D NULL; su =3D su->next) {
+ if (su->count <=3D 0)
+ continue;
+ any_supp =3D True;
+ if (VG_(clo_xml)) {
+ VG_(message)(Vg_DebugMsg,=20
+ "<supp><count>%d</count><name>%s</name></supp>",=20
+ su->count, su->sname);
+ } else {
+ VG_(message)(Vg_DebugMsg, "supp: %4d %s", su->count, su->sname)=
;
+ }
+ }
+
+ return any_supp;
+}
+
+
/* This is called not from generated code but from the scheduler */
void VG_(show_all_errors) ( void )
{
@@ -652,6 +687,15 @@
if (su->count > 0)
n_supp_contexts++;
}
+
+ /* If we're printing XML, just show the suppressions and stop.
+ */
+ if (VG_(clo_xml)) {
+ (void)show_used_suppressions();
+ return;
+ }
+
+ /* We only get here if not printing XML. */
VG_(message)(Vg_UserMsg,
"ERROR SUMMARY: "
"%d errors from %d contexts (suppressed: %d from %d)",
@@ -691,13 +735,7 @@
=20
if (n_supp_contexts > 0)=20
VG_(message)(Vg_DebugMsg, "");
- any_supp =3D False;
- for (su =3D suppressions; su !=3D NULL; su =3D su->next) {
- if (su->count > 0) {
- any_supp =3D True;
- VG_(message)(Vg_DebugMsg, "supp: %4d %s", su->count, su->sname)=
;
- }
- }
+ any_supp =3D show_used_suppressions();
=20
if (n_err_contexts > 0) {
if (any_supp)=20
Modified: trunk/coregrind/m_options.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/m_options.c 2005-05-18 22:56:00 UTC (rev 3772)
+++ trunk/coregrind/m_options.c 2005-05-19 00:25:45 UTC (rev 3773)
@@ -43,6 +43,7 @@
Int VG_(clo_gen_suppressions) =3D 0;
Int VG_(clo_sanity_level) =3D 1;
Int VG_(clo_verbosity) =3D 1;
+Bool VG_(clo_xml) =3D False;
Bool VG_(clo_demangle) =3D True;
Bool VG_(clo_trace_children) =3D False;
Int VG_(clo_log_fd) =3D 2;
Modified: trunk/coregrind/m_stacktrace.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/m_stacktrace.c 2005-05-18 22:56:00 UTC (rev 3772)
+++ trunk/coregrind/m_stacktrace.c 2005-05-19 00:25:45 UTC (rev 3773)
@@ -191,14 +191,26 @@
static UChar buf[VG_ERRTXT_LEN];
=20
VG_(describe_IP)(ip, buf, VG_ERRTXT_LEN);
- VG_(message)(Vg_UserMsg, " %s %s", ( n =3D=3D 0 ? "at" : "by" ), bu=
f);
+
+ if (VG_(clo_xml)) {
+ VG_(message)(Vg_UserMsg, " %s", buf);
+ } else {
+ VG_(message)(Vg_UserMsg, " %s %s", ( n =3D=3D 0 ? "at" : "by" ),=
buf);
+ }
}
=20
/* Print a StackTrace. */
void VG_(pp_StackTrace) ( StackTrace ips, UInt n_ips )
{
vg_assert( n_ips > 0 );
+
+ if (VG_(clo_xml))
+ VG_(message)(Vg_UserMsg, " <stack>");
+
VG_(apply_StackTrace)( printIpDesc, ips, n_ips );
+
+ if (VG_(clo_xml))
+ VG_(message)(Vg_UserMsg, " </stack>");
}
=20
/* Get and immediately print a StackTrace. */
Modified: trunk/coregrind/m_translate.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/m_translate.c 2005-05-18 22:56:00 UTC (rev 3772)
+++ trunk/coregrind/m_translate.c 2005-05-19 00:25:45 UTC (rev 3773)
@@ -407,7 +407,7 @@
ok =3D VG_(get_fnname_w_offset)(redir, name2, 64);
if (!ok) VG_(strcpy)(name2, "???");
VG_(message)(Vg_DebugMsg,=20
- "TRANSLATE: 0x%llx (%s) redirected to 0x%llx (%s)",
+ "REDIR: 0x%llx (%s) redirected to 0x%llx (%s)",
orig_addr, name1,
redir, name2 );
}
Modified: trunk/coregrind/vg_main.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/vg_main.c 2005-05-18 22:56:00 UTC (rev 3772)
+++ trunk/coregrind/vg_main.c 2005-05-19 00:25:45 UTC (rev 3773)
@@ -1392,6 +1392,12 @@
vg_assert(0 =3D=3D res);
}
=20
+/*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D*/
+/*=3D=3D=3D Command-line: variables, processing, etc =
=3D=3D=3D*/
+/*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D*/
+
+// See pub_{core,tool}_options.h for explanations of all these.
+
static void usage ( Bool debug_help )
{
Char* usage1 =3D=20
@@ -1404,6 +1410,7 @@
" --version show version\n"
" -q --quiet run silently; only print error msgs\n"
" -v --verbose be more verbose, incl counts of errors\n"
+" --xml=3Dyes show errors as XML\n"
" --trace-children=3Dno|yes Valgrind-ise child processes? [no]\n"
" --track-fds=3Dno|yes track open file descriptors? [no]\n"
" --time-stamp=3Dno|yes add timestamps to log messages? [no]\n"
@@ -1627,6 +1634,7 @@
/* do nothing */
}
=20
+ else VG_BOOL_CLO(arg, "--xml", VG_(clo_xml))
else VG_BOOL_CLO(arg, "--branchpred", VG_(clo_branchpred))
else VG_BOOL_CLO(arg, "--db-attach", VG_(clo_db_attach))
else VG_BOOL_CLO(arg, "--demangle", VG_(clo_demangle))
@@ -1798,6 +1806,29 @@
VG_(bad_option)("--gen-suppressions=3D");
}
=20
+ /* If we've been asked to emit XML, mash around various other
+ options so as to constrain the output somewhat, and to remove
+ any need for user input during the run. */
+ if (VG_(clo_xml)) {
+ /* Disable suppression generation (requires user input) */
+ VG_(clo_gen_suppressions) =3D 0;
+ /* Disable attaching to GDB (requires user input) */
+ VG_(clo_db_attach) =3D False;
+ /* Set a known verbosity level */
+ VG_(clo_verbosity) =3D 1;
+ /* Disable error limits (this might be a bad idea!) */
+ VG_(clo_error_limit) =3D False;
+ /* Disable emulation warnings */
+ VG_(clo_show_emwarns) =3D False;
+ /* Disable waiting for GDB to debug Valgrind */
+ VG_(clo_wait_for_gdb) =3D False;
+ /* No file-descriptor leak checking yet */
+ VG_(clo_track_fds) =3D False;
+ /* Also, we want to set options for the leak checker, but that
+ will have to be done in Memcheck's flag-handling code, not
+ here. */
+ }
+
/* All non-logging-related options have been checked. If the logging
option specified is ok, we can switch to it, as we know we won't
have to generate any other command-line-related error messages.
@@ -1914,6 +1945,16 @@
}
}
=20
+
+ /* Check that the requested tool actually supports XML output. */
+ if (VG_(clo_xml) && 0 !=3D VG_(strcmp)(toolname, "memcheck")) {
+ VG_(clo_xml) =3D False;
+ VG_(message)(Vg_UserMsg,=20
+ "Currently only Memcheck supports XML output.");=20
+ VG_(bad_option)("--xml=3Dyes");
+ /*NOTREACHED*/
+ }
+
// Move log_fd into the safe range, so it doesn't conflict with any a=
pp fds.
// XXX: this is more or less duplicating the behaviour of the calls t=
o
// VG_(safe_fd)() above, although this does not close the original fd=
.
@@ -1932,27 +1973,43 @@
command line args, to help people trying to interpret the
results of a run which encompasses multiple processes. */
=20
+ if (VG_(clo_xml)) {
+ VG_(message)(Vg_UserMsg, "");
+ VG_(message)(Vg_UserMsg, "<valgrindoutput>");
+ VG_(message)(Vg_UserMsg, "");
+ VG_(message)(Vg_UserMsg, "<protocolversion>1</protocolversion>");
+ VG_(message)(Vg_UserMsg, "");
+ }
+
+ HChar* xpre =3D VG_(clo_xml) ? "<preamble>" : "";
+ HChar* xpost =3D VG_(clo_xml) ? "</preamble>" : "";
+
if (VG_(clo_verbosity > 0)) {
/* Tool details */
- VG_(message)(Vg_UserMsg, "%s%s%s, %s.",
+ VG_(message)(Vg_UserMsg, "%s%s%s%s, %s.%s",
+ xpre,
VG_(details).name,=20
NULL =3D=3D VG_(details).version ? "" : "-",
NULL =3D=3D VG_(details).version=20
? (Char*)"" : VG_(details).version,
- VG_(details).description);
- VG_(message)(Vg_UserMsg, "%s", VG_(details).copyright_author);
+ VG_(details).description,
+ xpost);
+ VG_(message)(Vg_UserMsg, "%s%s%s",=20
+ xpre, VG_(details).copyright_author, xpos=
t);
=20
/* Core details */
VG_(message)(Vg_UserMsg,
- "Using LibVEX rev %s, a library for dynamic binary translation.=
",
- LibVEX_Version() );
+ "%sUsing LibVEX rev %s, a library for dynamic binary translatio=
n.%s",
+ xpre, LibVEX_Version(), xpost );
VG_(message)(Vg_UserMsg,=20
- "Copyright (C) 2004-2005, and GNU GPL'd, by OpenWorks LLP.");
+ "%sCopyright (C) 2004-2005, and GNU GPL'd, by OpenWorks LLP.%s"=
,
+ xpre, xpost );
VG_(message)(Vg_UserMsg,
- "Using valgrind-%s, a dynamic binary instrumentation framework.=
",
- VERSION);
+ "%sUsing valgrind-%s, a dynamic binary instrumentation framewor=
k.%s",
+ xpre, VERSION, xpost);
VG_(message)(Vg_UserMsg,=20
- "Copyright (C) 2000-2005, and GNU GPL'd, by Julian Seward et al=
.");
+ "%sCopyright (C) 2000-2005, and GNU GPL'd, by Julian Seward et =
al.%s",
+ xpre, xpost );
}
=20
if (VG_(clo_verbosity) > 0 && log_to !=3D VgLogTo_Fd) {
@@ -1963,6 +2020,17 @@
for (i =3D 0; i < VG_(client_argc); i++)=20
VG_(message)(Vg_UserMsg, " %s", VG_(client_argv)[i]);
}
+ else
+ if (VG_(clo_xml)) {
+ VG_(message)(Vg_UserMsg, "");
+ VG_(message)(Vg_UserMsg, "<pid>%d</pid>", VG_(getpid)());
+ VG_(message)(Vg_UserMsg, "<ppid>%d</ppid>", VG_(getppid)());
+ VG_(message)(Vg_UserMsg, "");
+ VG_(message)(Vg_UserMsg, "<argv>"); =20
+ for (i =3D 0; i < VG_(client_argc); i++)=20
+ VG_(message)(Vg_UserMsg, " <arg>%s</arg>", VG_(client_argv)[i]=
);
+ VG_(message)(Vg_UserMsg, "</argv>"); =20
+ }
=20
if (VG_(clo_verbosity) > 1) {
Int fd;
@@ -1983,7 +2051,7 @@
if (fd < 0) {
VG_(message)(Vg_DebugMsg, " can't open /proc/version");
} else {
- #define BUF_LEN 256
+# define BUF_LEN 256
Char version_buf[BUF_LEN];
Int n =3D VG_(read) ( fd, version_buf, BUF_LEN );
vg_assert(n <=3D BUF_LEN);
@@ -1994,7 +2062,7 @@
VG_(message)(Vg_DebugMsg, " (empty?)");
}
VG_(close)(fd);
- #undef BUF_LEN
+# undef BUF_LEN
}
}
=20
@@ -2291,8 +2359,10 @@
=20
remains =3D VGA_(stack_unused)(tid);
if (remains < VKI_PAGE_SIZE)
- VG_(message)(Vg_DebugMsg, "WARNING: Thread %d is within %d bytes of=
running out of stack!",
- tid, remains);
+ VG_(message)(Vg_DebugMsg,=20
+ "WARNING: Thread %d is within %d bytes "
+ "of running out of stack!",
+ tid, remains);
}
=20
/*=20
@@ -2726,7 +2796,7 @@
// Verbosity message
// p: end_rdtsc_calibration [so startup message is printed first]
//--------------------------------------------------------------
- if (VG_(clo_verbosity) =3D=3D 1)
+ if (VG_(clo_verbosity) =3D=3D 1 && !VG_(clo_xml))
VG_(message)(Vg_UserMsg, "For more details, rerun with: -v");
if (VG_(clo_verbosity) > 0)
VG_(message)(Vg_UserMsg, "");
@@ -2745,6 +2815,11 @@
=20
vg_assert(VG_(master_tid) =3D=3D 1);
=20
+ if (VG_(clo_xml)) {
+ VG_(message)(Vg_UserMsg, "<status>RUNNING</status>");
+ VG_(message)(Vg_UserMsg, "");
+ }
+
VG_(debugLog)(1, "main", "Running thread 1\n");
VGA_(main_thread_wrapper)(1);
=20
@@ -2780,6 +2855,11 @@
if (VG_(clo_verbosity) > 0)
VG_(message)(Vg_UserMsg, "");
=20
+ if (VG_(clo_xml)) {
+ VG_(message)(Vg_UserMsg, "<status>FINISHED</status>");
+ VG_(message)(Vg_UserMsg, "");
+ }
+
/* Print out file descriptor summary and stats. */
if (VG_(clo_track_fds))
VG_(show_open_fds)();
@@ -2789,6 +2869,12 @@
=20
VG_TDICT_CALL(tool_fini, 0/*exitcode*/);
=20
+ if (VG_(clo_xml)) {
+ VG_(message)(Vg_UserMsg, "");
+ VG_(message)(Vg_UserMsg, "</valgrindoutput>");
+ VG_(message)(Vg_UserMsg, "");
+ }
+
VG_(sanity_check_general)( True /*include expensive checks*/ );
=20
if (VG_(clo_verbosity) > 1)
Modified: trunk/coregrind/vg_messages.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/vg_messages.c 2005-05-18 22:56:00 UTC (rev 3772)
+++ trunk/coregrind/vg_messages.c 2005-05-19 00:25:45 UTC (rev 3773)
@@ -59,8 +59,10 @@
=20
// Print the message
count =3D 0;
- count +=3D VG_(printf) ("%s%c%c", pfx_s, c,c);
=20
+ if (!VG_(clo_xml))
+ count +=3D VG_(printf) ("%s%c%c", pfx_s, c,c);
+
if (VG_(clo_time_stamp)) {
struct timeval tv;
struct tm tm;
@@ -75,7 +77,9 @@
}
}
=20
- count +=3D VG_(printf) ("%d%c%c ", VG_(getpid)(), c,c);
+ if (!VG_(clo_xml))
+ count +=3D VG_(printf) ("%d%c%c ", VG_(getpid)(), c,c);
+
count +=3D VG_(vprintf)(format, vargs);
count +=3D VG_(printf) ("\n");
return count;
Modified: trunk/coregrind/vg_symtab2.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/vg_symtab2.c 2005-05-18 22:56:00 UTC (rev 3772)
+++ trunk/coregrind/vg_symtab2.c 2005-05-19 00:25:45 UTC (rev 3773)
@@ -2436,7 +2436,7 @@
buf[n] =3D '\0'; \
}
UInt lineno;=20
- UChar ibuf[20];
+ UChar ibuf[50];
UInt n =3D 0;
static UChar buf_fn[VG_ERRTXT_LEN];
static UChar buf_obj[VG_ERRTXT_LEN];
@@ -2445,29 +2445,62 @@
Bool know_objname =3D VG_(get_objname)(eip, buf_obj, VG_ERRTXT_LEN);
Bool know_srcloc =3D VG_(get_filename_linenum)(eip, buf_srcloc,
VG_ERRTXT_LEN, &lineno=
);
- VG_(sprintf)(ibuf,"0x%llx: ", (ULong)eip);
- APPEND(ibuf);
- if (know_fnname) {=20
- APPEND(buf_fn);
- if (!know_srcloc && know_objname) {
- APPEND(" (in ");
+
+ if (VG_(clo_xml)) {
+
+ /* Print in XML format, dumping in as much info as we know. */
+ APPEND("<frame>");
+ VG_(sprintf)(ibuf,"<ip>0x%llx</ip>", (ULong)eip);
+ APPEND(ibuf);
+ if (know_objname) {
+ APPEND("<obj>");
APPEND(buf_obj);
- APPEND(")");
+ APPEND("</obj>");
}
- } else if (know_objname && !know_srcloc) {
- APPEND("(within ");
- APPEND(buf_obj);
- APPEND(")");
+ if (know_fnname) {
+ APPEND("<fn>");
+ APPEND(buf_fn);
+ APPEND("</fn>");
+ }
+ if (know_srcloc) {
+ APPEND("<file>");
+ APPEND(buf_srcloc);
+ APPEND("</file>");
+ APPEND("<line>");
+ VG_(sprintf)(ibuf,"%d",lineno);
+ APPEND(ibuf);
+ APPEND("</line>");
+ }
+ APPEND("</frame>");
+
} else {
- APPEND("???");
- }
- if (know_srcloc) {
- APPEND(" (");
- APPEND(buf_srcloc);
- APPEND(":");
- VG_(sprintf)(ibuf,"%d",lineno);
+
+ /* Print for humans to read */
+ VG_(sprintf)(ibuf,"0x%llx: ", (ULong)eip);
APPEND(ibuf);
- APPEND(")");
+ if (know_fnname) {=20
+ APPEND(buf_fn);
+ if (!know_srcloc && know_objname) {
+ APPEND(" (in ");
+ APPEND(buf_obj);
+ APPEND(")");
+ }
+ } else if (know_objname && !know_srcloc) {
+ APPEND("(within ");
+ APPEND(buf_obj);
+ APPEND(")");
+ } else {
+ APPEND("???");
+ }
+ if (know_srcloc) {
+ APPEND(" (");
+ APPEND(buf_srcloc);
+ APPEND(":");
+ VG_(sprintf)(ibuf,"%d",lineno);
+ APPEND(ibuf);
+ APPEND(")");
+ }
+
}
return buf;
=20
Modified: trunk/include/pub_tool_options.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/include/pub_tool_options.h 2005-05-18 22:56:00 UTC (rev 3772)
+++ trunk/include/pub_tool_options.h 2005-05-19 00:25:45 UTC (rev 3773)
@@ -61,11 +61,16 @@
}
=20
/* Verbosity level: 0 =3D silent, 1 (default), > 1 =3D more verbose. */
-extern Int VG_(clo_verbosity);
+extern Int VG_(clo_verbosity);
=20
-/* Profile? */
-extern Bool VG_(clo_profile);
+/* Profile? default: NO */
+extern Bool VG_(clo_profile);
=20
+/* Emit all messages as XML? default: NO */
+/* If clo_xml is set, various other options are set in a non-default
+ way. See vg_main.c and mc_main.c. */
+extern Bool VG_(clo_xml);
+
/* Call this if a recognised option was bad for some reason.
Note: don't use it just because an option was unrecognised -- return =
'False'
from VG_(tdict).tool_process_cmd_line_option) to indicate that. */
Modified: trunk/memcheck/mac_leakcheck.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/memcheck/mac_leakcheck.c 2005-05-18 22:56:00 UTC (rev 3772)
+++ trunk/memcheck/mac_leakcheck.c 2005-05-19 00:25:45 UTC (rev 3773)
@@ -184,40 +184,79 @@
static Bool (*lc_is_within_valid_secondary) (Addr addr);
static Bool (*lc_is_valid_aligned_word) (Addr addr);
=20
-static const Char *str_lossmode(Reachedness lossmode)
+static const HChar* str_lossmode ( Reachedness lossmode )
{
- const Char *loss =3D "?";
+ const HChar *loss =3D "?";
+ switch (lossmode) {
+ case Unreached: loss =3D "definitely lost"; break;
+ case IndirectLeak: loss =3D "indirectly lost"; break;
+ case Interior: loss =3D "possibly lost"; break;
+ case Proper: loss =3D "still reachable"; break;
+ }
+ return loss;
+}
=20
- switch(lossmode) {
- case Unreached: loss =3D "definitely lost"; break;
- case IndirectLeak: loss =3D "indirectly lost"; break;
- case Interior: loss =3D "possibly lost"; break;
- case Proper: loss =3D "still reachable"; break;
+static const HChar* xml_kind ( Reachedness lossmode )
+{
+ const HChar *loss =3D "?";
+ switch (lossmode) {
+ case Unreached: loss =3D "Leak_DefinitelyLost"; break;
+ case IndirectLeak: loss =3D "Leak_IndirectlyLost"; break;
+ case Interior: loss =3D "Leak_PossiblyLost"; break;
+ case Proper: loss =3D "Leak_StillReachable"; break;
}
-
return loss;
}
=20
+
/* Used for printing leak errors, avoids exposing the LossRecord type (w=
hich
comes in as void*, requiring a cast. */
void MAC_(pp_LeakError)(void* vextra)
{
+ HChar* xpre =3D VG_(clo_xml) ? " <what>" : "";
+ HChar* xpost =3D VG_(clo_xml) ? "</what>" : "";
+
LeakExtra* extra =3D (LeakExtra*)vextra;
LossRecord* l =3D extra->lossRecord;
const Char *loss =3D str_lossmode(l->loss_mode);
=20
- VG_(message)(Vg_UserMsg, "");
+ if (VG_(clo_xml)) {
+ VG_(message)(Vg_UserMsg, " <kind>%s</kind>", xml_kind(l->loss_mod=
e));
+ } else {
+ VG_(message)(Vg_UserMsg, "");
+ }
+
if (l->indirect_bytes) {
VG_(message)(Vg_UserMsg,=20
- "%d (%d direct, %d indirect) bytes in %d blocks are %s in loss reco=
rd %d of %d",
- l->total_bytes + l->indirect_bytes,=20
- l->total_bytes, l->indirect_bytes, l->num_blocks,
- loss, extra->n_this_record, extra->n_total_records);
+ "%s%d (%d direct, %d indirect) bytes in %d blocks"
+ " are %s in loss record %d of %d%s",
+ xpre,
+ l->total_bytes + l->indirect_bytes,=20
+ l->total_bytes, l->indirect_bytes, l->num_blocks,
+ loss, extra->n_this_record, extra->n_total_records,
+ xpost
+ );
+ if (VG_(clo_xml)) {
+ VG_(message)(Vg_UserMsg, " <leakedbytes>%d</leakedbytes>",=20
+ l->total_bytes + l->indirect_bytes);
+ VG_(message)(Vg_UserMsg, " <leakedblocks>%d</leakedblocks>",=20
+ l->num_blocks);
+ }
} else {
- VG_(message)(Vg_UserMsg,=20
- "%d bytes in %d blocks are %s in loss record %d of %d",
- l->total_bytes, l->num_blocks,
- loss, extra->n_this_record, extra->n_total_records);
+ VG_(message)(
+ Vg_UserMsg,=20
+ "%s%d bytes in %d blocks are %s in loss record %d of %d%s",
+ xpre,
+ l->total_bytes, l->num_blocks,
+ loss, extra->n_this_record, extra->n_total_records,
+ xpost
+ );
+ if (VG_(clo_xml)) {
+ VG_(message)(Vg_UserMsg, " <leakedbytes>%d</leakedbytes>",=20
+ l->total_bytes);
+ VG_(message)(Vg_UserMsg, " <leakedblocks>%d</leakedblocks>",=20
+ l->num_blocks);
+ }
}
VG_(pp_ExeContext)(l->allocated_at);
}
@@ -612,14 +651,14 @@
=20
if (lc_n_shadows =3D=3D 0) {
tl_assert(lc_shadows =3D=3D NULL);
- if (VG_(clo_verbosity) >=3D 1) {
+ if (VG_(clo_verbosity) >=3D 1 && !VG_(clo_xml)) {
VG_(message)(Vg_UserMsg,=20
"No malloc'd blocks -- no leaks are possible.");
}
return;
}
=20
- if (VG_(clo_verbosity) > 0)
+ if (VG_(clo_verbosity) > 0 && !VG_(clo_xml))
VG_(message)(Vg_UserMsg,=20
"searching for pointers to %d not-freed blocks.",=20
lc_n_shadows );
@@ -650,7 +689,7 @@
/* Keep walking the heap until everything is found */
lc_do_leakcheck(-1);
=20
- if (VG_(clo_verbosity) > 0)
+ if (VG_(clo_verbosity) > 0 && !VG_(clo_xml))
VG_(message)(Vg_UserMsg, "checked %d bytes.", lc_scanned);
=20
blocks_leaked =3D MAC_(bytes_leaked) =3D 0;
@@ -664,7 +703,7 @@
else
make_summary();
=20
- if (VG_(clo_verbosity) > 0) {
+ if (VG_(clo_verbosity) > 0 && !VG_(clo_xml)) {
VG_(message)(Vg_UserMsg, "");
VG_(message)(Vg_UserMsg, "LEAK SUMMARY:");
VG_(message)(Vg_UserMsg, " definitely lost: %d bytes in %d block=
s.",=20
Modified: trunk/memcheck/mac_malloc_wrappers.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/memcheck/mac_malloc_wrappers.c 2005-05-18 22:56:00 UTC (rev 377=
2)
+++ trunk/memcheck/mac_malloc_wrappers.c 2005-05-19 00:25:45 UTC (rev 377=
3)
@@ -549,6 +549,8 @@
=20
if (VG_(clo_verbosity) =3D=3D 0)
return;
+ if (VG_(clo_xml))
+ return;
=20
/* Count memory still in use. */
VG_(HT_apply_to_all_nodes)(MAC_(malloc_list), malloc_stats_count_chun=
k, &ms);
Modified: trunk/memcheck/mac_shared.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/memcheck/mac_shared.c 2005-05-18 22:56:00 UTC (rev 3772)
+++ trunk/memcheck/mac_shared.c 2005-05-19 00:25:45 UTC (rev 3773)
@@ -222,23 +222,27 @@
=20
void MAC_(pp_AddrInfo) ( Addr a, AddrInfo* ai )
{
+ HChar* xpre =3D VG_(clo_xml) ? " <auxwhat>" : " ";
+ HChar* xpost =3D VG_(clo_xml) ? "</auxwhat>" : "";
+
switch (ai->akind) {
case Stack:=20
VG_(message)(Vg_UserMsg,=20
- " Address 0x%lx is on thread %d's stack",=20
- (ULong)a, ai->stack_tid);
+ "%sAddress 0x%llx is on thread %d's stack%s",=20
+ xpre, (ULong)a, ai->stack_tid, xpost);
break;
case Unknown:
if (ai->maybe_gcc) {
VG_(message)(Vg_UserMsg,=20
- " Address 0x%lx is just below %%esp. Possibly a bug in G=
CC/G++",
- (ULong)a);
- VG_(message)(Vg_UserMsg,=20
- " v 2.96 or 3.0.X. To suppress, use: --workaround-gcc29=
6-bugs=3Dyes");
+ "%sAddress 0x%llx is just below the stack ptr. "
+ "To suppress, use: --workaround-gcc296-bugs=3Dyes%s",
+ xpre, (ULong)a, xpost
+ );
} else {
VG_(message)(Vg_UserMsg,=20
- " Address 0x%lx is not stack'd, malloc'd or (recently) fr=
ee'd",
- (ULong)a);
+ "%sAddress 0x%llx "
+ "is not stack'd, malloc'd or (recently) free'd%s",
+ xpre, (ULong)a, xpost);
}
break;
case Freed: case Mallocd: case UserG: case Mempool: {
@@ -264,12 +268,14 @@
relative =3D "inside";
}
VG_(message)(Vg_UserMsg,=20
- " Address 0x%lx is %llu bytes %s a %s of size %d %s",
+ "%sAddress 0x%llx is %llu bytes %s a %s of size %d %s%s",
+ xpre,
(ULong)a, (ULong)delta, relative, kind,
ai->blksize,
ai->akind=3D=3DMallocd ? "alloc'd"=20
: ai->akind=3D=3DFreed ? "free'd"=20
- : "client-defined");
+ : "client-defined",
+ xpost);
VG_(pp_ExeContext)(ai->lastchange);
break;
}
@@ -288,14 +294,26 @@
{
MAC_Error* err_extra =3D VG_(get_error_extra)(err);
=20
+ HChar* xpre =3D VG_(clo_xml) ? " <what>" : "";
+ HChar* xpost =3D VG_(clo_xml) ? "</what>" : "";
+
switch (VG_(get_error_kind)(err)) {
case FreeErr:
- VG_(message)(Vg_UserMsg, "Invalid free() / delete / delete[]");
- /* fall through */
+ if (VG_(clo_xml))
+ VG_(message)(Vg_UserMsg, " <kind>InvalidFree</kind>");
+ VG_(message)(Vg_UserMsg,=20
+ "%sInvalid free() / delete / delete[]%s",
+ xpre, xpost);
+ VG_(pp_ExeContext)( VG_(get_error_where)(err) );
+ MAC_(pp_AddrInfo)(VG_(get_error_address)(err), &err_extra->addr=
info);
+ break;
+
case FreeMismatchErr:
- if (VG_(get_error_kind)(err) =3D=3D FreeMismatchErr)
- VG_(message)(Vg_UserMsg,=20
- "Mismatched free() / delete / delete []");
+ if (VG_(clo_xml))
+ VG_(message)(Vg_UserMsg, " <kind>MismatchedFree</kind>");
+ VG_(message)(Vg_UserMsg,=20
+ "%sMismatched free() / delete / delete []%s",
+ xpre, xpost);
VG_(pp_ExeContext)( VG_(get_error_where)(err) );
MAC_(pp_AddrInfo)(VG_(get_error_address)(err), &err_extra->addr=
info);
break;
@@ -303,16 +321,26 @@
case AddrErr:
switch (err_extra->axskind) {
case ReadAxs:
- VG_(message)(Vg_UserMsg, "Invalid read of size %d",=20
- err_extra->size );=20
+ if (VG_(clo_xml))
+ VG_(message)(Vg_UserMsg, " <kind>InvalidRead</kind>")=
;
+ VG_(message)(Vg_UserMsg,
+ "%sInvalid read of size %d%s",=20
+ xpre, err_extra->size, xpost );=20
break;
case WriteAxs:
- VG_(message)(Vg_UserMsg, "Invalid write of size %d",=20
- err_extra->size );=20
+ if (VG_(clo_xml))
+ VG_(message)(Vg_UserMsg, " <kind>InvalidWrite</kind>"=
);
+ VG_(message)(Vg_UserMsg,=20
+ "%sInvalid write of size %d%s",=20
+ xpre, err_extra->size, xpost );=20
break;
case ExecAxs:
- VG_(message)(Vg_UserMsg, "Jump to the invalid address "
- "stated on the next line");
+ if (VG_(clo_xml))
+ VG_(message)(Vg_UserMsg, " <kind>InvalidJump</kind>")=
;
+ VG_(message)(Vg_UserMsg,=20
+ "%sJump to the invalid address "
+ "stated on the next line%s",
+ xpre, xpost);
break;
default:=20
VG_(tool_panic)("MAC_(pp_shared_Error)(axskind)");
@@ -323,16 +351,22 @@
=20
case OverlapErr: {
OverlapExtra* ov_extra =3D (OverlapExtra*)VG_(get_error_extra)(=
err);
+ if (VG_(clo_xml))
+ VG_(message)(Vg_UserMsg, " <kind>Overlap</kind>");
if (ov_extra->len =3D=3D -1)
VG_(message)(Vg_UserMsg,
- "Source and destination overlap in %s(%p, %p)",
+ "%sSource and destination overlap in %s(%p, %p)=
%s",
+ xpre,
VG_(get_error_string)(err),
- ov_extra->dst, ov_extra->src);
+ ov_extra->dst, ov_extra->src,
+ xpost);
else
VG_(message)(Vg_UserMsg,
- "Source and destination overlap in %s(%p, %p, %=
d)",
+ "%sSource and destination overlap in %s(%p, %p,=
%d)%s",
+ xpre,
VG_(get_error_string)(err),
- ov_extra->dst, ov_extra->src, ov_extra->len);
+ ov_extra->dst, ov_extra->src, ov_extra->len,
+ xpost);
VG_(pp_ExeContext)( VG_(get_error_where)(err) );
break;
}
@@ -342,7 +376,10 @@
}
=20
case IllegalMempoolErr:
- VG_(message)(Vg_UserMsg, "Illegal memory pool address");
+ if (VG_(clo_xml))
+ VG_(message)(Vg_UserMsg, " <kind>InvalidMemPool</kind>");
+ VG_(message)(Vg_UserMsg, "%sIllegal memory pool address%s",
+ xpre, xpost);
VG_(pp_ExeContext)( VG_(get_error_where)(err) );
MAC_(pp_AddrInfo)(VG_(get_error_address)(err), &err_extra->addr=
info);
break;
@@ -860,7 +897,7 @@
{
MAC_(print_malloc_stats)();
=20
- if (VG_(clo_verbosity) =3D=3D 1) {
+ if (VG_(clo_verbosity) =3D=3D 1 && !VG_(clo_xml)) {
if (MAC_(clo_leak_check) =3D=3D LC_Off)
VG_(message)(Vg_UserMsg,=20
"For a detailed leak analysis, rerun with: --leak-check=3D=
yes");
Modified: trunk/memcheck/mc_main.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/memcheck/mc_main.c 2005-05-18 22:56:00 UTC (rev 3772)
+++ trunk/memcheck/mc_main.c 2005-05-19 00:25:45 UTC (rev 3773)
@@ -1313,11 +1313,18 @@
{
MAC_Error* err_extra =3D VG_(get_error_extra)(err);
=20
+ HChar* xpre =3D VG_(clo_xml) ? " <what>" : "";
+ HChar* xpost =3D VG_(clo_xml) ? "</what>" : "";
+
switch (VG_(get_error_kind)(err)) {
case CoreMemErr: {
Char* s =3D ( err_extra->isUnaddr ? "unaddressable" : "uninitia=
lised" );
- VG_(message)(Vg_UserMsg, "%s contains %s byte(s)",=20
- VG_(get_error_string)(err), s);
+ if (VG_(clo_xml))
+ VG_(message)(Vg_UserMsg, " <kind>CoreMemError</kind>");
+ /* What the hell *is* a CoreMemError? jrs 2005-May-18 */
+ VG_(message)(Vg_UserMsg, "%s%s contains %s byte(s)%s",=20
+ xpre, VG_(get_error_string)(err), s, xpost);
+
VG_(pp_ExeContext)( VG_(get_error_where)(err) );
break;
=20
@@ -1325,12 +1332,17 @@
=20
case ValueErr:
if (err_extra->size =3D=3D 0) {
- VG_(message)(Vg_UserMsg,
- "Conditional jump or move depends on uninitialised value=
(s)");
+ if (VG_(clo_xml))
+ VG_(message)(Vg_UserMsg, " <kind>UninitCondition</kind>"=
);
+ VG_(message)(Vg_UserMsg, "%sConditional jump or move depends=
"
+ " on uninitialised value(s)%s",=20
+ xpre, xpost);
} else {
- VG_(message)(Vg_UserMsg,
- "Use of uninitialised value of size %d",
- err_extra->size);
+ if (VG_(clo_xml))
+ VG_(message)(Vg_UserMsg, " <kind>UninitValue</kind>");
+ VG_(message)(Vg_UserMsg,
+ "%sUse of uninitialised value of size %d%s",
+ xpre, err_extra->size, xpost);
}
VG_(pp_ExeContext)( VG_(get_error_where)(err) );
break;
@@ -1341,8 +1353,10 @@
Char* s2 =3D ( err_extra->isUnaddr ? "unaddressable" : "uniniti=
alised" );
if (isReg) tl_assert(!err_extra->isUnaddr);
=20
- VG_(message)(Vg_UserMsg, "Syscall param %s %s %s byte(s)",
- VG_(get_error_string)(err), s1, s2);
+ if (VG_(clo_xml))
+ VG_(message)(Vg_UserMsg, " <kind>SyscallParam</kind>");
+ VG_(message)(Vg_UserMsg, "%sSyscall param %s %s %s byte(s)%s",
+ xpre, VG_(get_error_string)(err), s1, s2, xpost);
=20
VG_(pp_ExeContext)( VG_(get_error_where)(err) );
MAC_(pp_AddrInfo)(VG_(get_error_address)(err), &err_extra->addr=
info);
@@ -1351,8 +1365,11 @@
case UserErr: {
Char* s =3D ( err_extra->isUnaddr ? "Unaddressable" : "Uninitia=
lised" );
=20
+ if (VG_(clo_xml))
+ VG_(message)(Vg_UserMsg, " <kind>ClientCheck</kind>");
VG_(message)(Vg_UserMsg,=20
- "%s byte(s) found during client check request", s);
+ "%s%s byte(s) found during client check request%s",=20
+ xpre, s, xpost);
=20
VG_(pp_ExeContext)( VG_(get_error_where)(err) );
MAC_(pp_AddrInfo)(VG_(get_error_address)(err), &err_extra->addr=
info);
@@ -2426,6 +2443,13 @@
=20
static void mc_post_clo_init ( void )
{
+ /* If we've been asked to emit XML, mash around various other
+ options so as to constrain the output somewhat. */
+ if (VG_(clo_xml)) {
+ /* Extract as much info as possible from the leak checker. */
+ MAC_(clo_show_reachable) =3D True;
+ MAC_(clo_leak_check) =3D LC_Full;
+ }
}
=20
static void mc_fini ( Int exitcode )
|