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
(21) |
|
2
(19) |
3
(33) |
4
(24) |
5
(18) |
6
(13) |
7
(22) |
8
(21) |
|
9
(38) |
10
(25) |
11
(20) |
12
(27) |
13
(43) |
14
(9) |
15
(19) |
|
16
(37) |
17
(19) |
18
(13) |
19
(11) |
20
(8) |
21
(11) |
22
(25) |
|
23
(21) |
24
(30) |
25
(18) |
26
(11) |
27
(10) |
28
(14) |
29
(40) |
|
30
(24) |
31
(14) |
|
|
|
|
|
Author: sewardj
Date: 2008-03-29 14:08:12 +0000 (Sat, 29 Mar 2008)
New Revision: 7809
Log:
Framework level changes to support double (guest state) shadowing.
Modified:
branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_initimg/initimg-linux.c
branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_machine.c
branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_scheduler/scheduler.c
branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_sigframe/sigframe-amd64-linux.c
branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_sigframe/sigframe-x86-linux.c
branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_syswrap/syswrap-amd64-linux.c
branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_syswrap/syswrap-x86-linux.c
branches/OTRACK_BY_INSTRUMENTATION/coregrind/pub_core_threadstate.h
branches/OTRACK_BY_INSTRUMENTATION/include/pub_tool_machine.h
Modified: branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_initimg/initimg-linux.c
===================================================================
--- branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_initimg/initimg-linux.c 2008-03-29 13:38:48 UTC (rev 7808)
+++ branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_initimg/initimg-linux.c 2008-03-29 14:08:12 UTC (rev 7809)
@@ -962,8 +962,9 @@
sane way. */
LibVEX_GuestX86_initialise(&arch->vex);
- /* Zero out the shadow area. */
- VG_(memset)(&arch->vex_shadow, 0, sizeof(VexGuestX86State));
+ /* Zero out the shadow areas. */
+ VG_(memset)(&arch->vex_shadow1, 0, sizeof(VexGuestX86State));
+ VG_(memset)(&arch->vex_shadow2, 0, sizeof(VexGuestX86State));
/* Put essential stuff into the new state. */
arch->vex.guest_ESP = iifii.initial_client_SP;
@@ -982,8 +983,9 @@
sane way. */
LibVEX_GuestAMD64_initialise(&arch->vex);
- /* Zero out the shadow area. */
- VG_(memset)(&arch->vex_shadow, 0, sizeof(VexGuestAMD64State));
+ /* Zero out the shadow areas. */
+ VG_(memset)(&arch->vex_shadow1, 0, sizeof(VexGuestAMD64State));
+ VG_(memset)(&arch->vex_shadow2, 0, sizeof(VexGuestAMD64State));
/* Put essential stuff into the new state. */
arch->vex.guest_RSP = iifii.initial_client_SP;
@@ -996,8 +998,9 @@
sane way. */
LibVEX_GuestPPC32_initialise(&arch->vex);
- /* Zero out the shadow area. */
- VG_(memset)(&arch->vex_shadow, 0, sizeof(VexGuestPPC32State));
+ /* Zero out the shadow areas. */
+ VG_(memset)(&arch->vex_shadow1, 0, sizeof(VexGuestPPC32State));
+ VG_(memset)(&arch->vex_shadow2, 0, sizeof(VexGuestPPC32State));
/* Put essential stuff into the new state. */
arch->vex.guest_GPR1 = iifii.initial_client_SP;
@@ -1010,8 +1013,9 @@
sane way. */
LibVEX_GuestPPC64_initialise(&arch->vex);
- /* Zero out the shadow area. */
- VG_(memset)(&arch->vex_shadow, 0, sizeof(VexGuestPPC64State));
+ /* Zero out the shadow areas. */
+ VG_(memset)(&arch->vex_shadow1, 0, sizeof(VexGuestPPC64State));
+ VG_(memset)(&arch->vex_shadow2, 0, sizeof(VexGuestPPC64State));
/* Put essential stuff into the new state. */
arch->vex.guest_GPR1 = iifii.initial_client_SP;
Modified: branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_machine.c
===================================================================
--- branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_machine.c 2008-03-29 13:38:48 UTC (rev 7808)
+++ branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_machine.c 2008-03-29 14:08:12 UTC (rev 7809)
@@ -79,34 +79,44 @@
}
-void VG_(get_shadow_regs_area) ( ThreadId tid, OffT offset, SizeT size,
- UChar* area )
+void
+VG_(get_shadow_regs_area) ( ThreadId tid,
+ /*DST*/UChar* dst,
+ /*SRC*/Int shadowNo, OffT offset, SizeT size )
{
+ void* src;
ThreadState* tst;
-
+ vg_assert(shadowNo == 1 || shadowNo == 2);
vg_assert(VG_(is_valid_tid)(tid));
- tst = & VG_(threads)[tid];
-
// Bounds check
vg_assert(0 <= offset && offset < sizeof(VexGuestArchState));
vg_assert(offset + size <= sizeof(VexGuestArchState));
-
- VG_(memcpy)( area, (void*)(((Addr)&(tst->arch.vex_shadow)) + offset), size);
+ // Copy
+ tst = & VG_(threads)[tid];
+ src = shadowNo == 1
+ ? (void*)(((Addr)&(tst->arch.vex_shadow1)) + offset)
+ : (void*)(((Addr)&(tst->arch.vex_shadow2)) + offset);
+ VG_(memcpy)( dst, src, size);
}
-void VG_(set_shadow_regs_area) ( ThreadId tid, OffT offset, SizeT size,
- const UChar* area )
+void
+VG_(set_shadow_regs_area) ( ThreadId tid,
+ /*DST*/Int shadowNo, OffT offset, SizeT size,
+ /*SRC*/const UChar* src )
{
+ void* dst;
ThreadState* tst;
-
+ vg_assert(shadowNo == 1 || shadowNo == 2);
vg_assert(VG_(is_valid_tid)(tid));
- tst = & VG_(threads)[tid];
-
// Bounds check
vg_assert(0 <= offset && offset < sizeof(VexGuestArchState));
vg_assert(offset + size <= sizeof(VexGuestArchState));
-
- VG_(memcpy)( (void*)(((Addr)(&tst->arch.vex_shadow)) + offset), area, size);
+ // Copy
+ tst = & VG_(threads)[tid];
+ dst = shadowNo == 1
+ ? (void*)(((Addr)&(tst->arch.vex_shadow1)) + offset)
+ : (void*)(((Addr)&(tst->arch.vex_shadow2)) + offset);
+ VG_(memcpy)( dst, src, size);
}
Modified: branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_scheduler/scheduler.c
===================================================================
--- branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_scheduler/scheduler.c 2008-03-29 13:38:48 UTC (rev 7808)
+++ branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_scheduler/scheduler.c 2008-03-29 14:08:12 UTC (rev 7809)
@@ -530,33 +530,39 @@
/* Do various guest state alignment checks prior to running a thread.
Specifically, check that what we have matches Vex's guest state
layout requirements. */
-static void do_pre_run_checks ( volatile ThreadState* tst )
+static void do_pre_run_checks ( ThreadState* tst )
{
- Addr a_vex = (Addr) & tst->arch.vex;
- Addr a_vexsh = (Addr) & tst->arch.vex_shadow;
- Addr a_spill = (Addr) & tst->arch.vex_spill;
- UInt sz_vex = (UInt) sizeof tst->arch.vex;
- UInt sz_vexsh = (UInt) sizeof tst->arch.vex_shadow;
- UInt sz_spill = (UInt) sizeof tst->arch.vex_spill;
+ Addr a_vex = (Addr) & tst->arch.vex;
+ Addr a_vexsh1 = (Addr) & tst->arch.vex_shadow1;
+ Addr a_vexsh2 = (Addr) & tst->arch.vex_shadow2;
+ Addr a_spill = (Addr) & tst->arch.vex_spill;
+ UInt sz_vex = (UInt) sizeof tst->arch.vex;
+ UInt sz_vexsh1 = (UInt) sizeof tst->arch.vex_shadow1;
+ UInt sz_vexsh2 = (UInt) sizeof tst->arch.vex_shadow2;
+ UInt sz_spill = (UInt) sizeof tst->arch.vex_spill;
if (0)
VG_(printf)("%p %d %p %d %p %d\n",
- (void*)a_vex, sz_vex, (void*)a_vexsh, sz_vexsh,
+ (void*)a_vex, sz_vex, (void*)a_vexsh1, sz_vexsh1,
(void*)a_spill, sz_spill );
vg_assert(VG_IS_8_ALIGNED(sz_vex));
- vg_assert(VG_IS_8_ALIGNED(sz_vexsh));
+ vg_assert(VG_IS_8_ALIGNED(sz_vexsh1));
+ vg_assert(VG_IS_8_ALIGNED(sz_vexsh2));
vg_assert(VG_IS_16_ALIGNED(sz_spill));
vg_assert(VG_IS_4_ALIGNED(a_vex));
- vg_assert(VG_IS_4_ALIGNED(a_vexsh));
+ vg_assert(VG_IS_4_ALIGNED(a_vexsh1));
+ vg_assert(VG_IS_4_ALIGNED(a_vexsh2));
vg_assert(VG_IS_4_ALIGNED(a_spill));
- vg_assert(sz_vex == sz_vexsh);
- vg_assert(a_vex + sz_vex == a_vexsh);
+ vg_assert(sz_vex == sz_vexsh1);
+ vg_assert(sz_vex == sz_vexsh2);
+ vg_assert(a_vex + 1 * sz_vex == a_vexsh1);
+ vg_assert(a_vex + 2 * sz_vex == a_vexsh2);
vg_assert(sz_spill == LibVEX_N_SPILL_BYTES);
- vg_assert(a_vex + 2 * sz_vex == a_spill);
+ vg_assert(a_vex + 3 * sz_vex == a_spill);
# if defined(VGA_ppc32) || defined(VGA_ppc64)
/* ppc guest_state vector regs must be 16 byte aligned for
@@ -583,7 +589,7 @@
vg_assert(!VG_(is_exiting)(tid));
tst = VG_(get_ThreadState)(tid);
- do_pre_run_checks(tst);
+ do_pre_run_checks( (ThreadState*)tst );
/* end Paranoia */
trc = 0;
@@ -686,7 +692,7 @@
vg_assert(!VG_(is_exiting)(tid));
tst = VG_(get_ThreadState)(tid);
- do_pre_run_checks(tst);
+ do_pre_run_checks( (ThreadState*)tst );
/* end Paranoia */
# if defined(VGA_ppc32) || defined(VGA_ppc64)
Modified: branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_sigframe/sigframe-amd64-linux.c
===================================================================
--- branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_sigframe/sigframe-amd64-linux.c 2008-03-29 13:38:48 UTC (rev 7808)
+++ branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_sigframe/sigframe-amd64-linux.c 2008-03-29 14:08:12 UTC (rev 7809)
@@ -93,7 +93,8 @@
/* XXX This is wrong. Surely we should store the shadow values
into the shadow memory behind the actual values? */
- VexGuestAMD64State vex_shadow;
+ VexGuestAMD64State vex_shadow1;
+ VexGuestAMD64State vex_shadow2;
/* HACK ALERT */
VexGuestAMD64State vex;
@@ -422,7 +423,8 @@
{
frame->sigNo_private = sigNo;
frame->magicPI = 0x31415927;
- frame->vex_shadow = tst->arch.vex_shadow;
+ frame->vex_shadow1 = tst->arch.vex_shadow1;
+ frame->vex_shadow2 = tst->arch.vex_shadow2;
/* HACK ALERT */
frame->vex = tst->arch.vex;
/* end HACK ALERT */
@@ -541,13 +543,14 @@
*sigNo = VKI_SIGSEGV;
return False;
}
- tst->sig_mask = frame->mask;
- tst->tmp_sig_mask = frame->mask;
- tst->arch.vex_shadow = frame->vex_shadow;
+ tst->sig_mask = frame->mask;
+ tst->tmp_sig_mask = frame->mask;
+ tst->arch.vex_shadow1 = frame->vex_shadow1;
+ tst->arch.vex_shadow2 = frame->vex_shadow2;
/* HACK ALERT */
- tst->arch.vex = frame->vex;
+ tst->arch.vex = frame->vex;
/* end HACK ALERT */
- *sigNo = frame->sigNo_private;
+ *sigNo = frame->sigNo_private;
return True;
}
Modified: branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_sigframe/sigframe-x86-linux.c
===================================================================
--- branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_sigframe/sigframe-x86-linux.c 2008-03-29 13:38:48 UTC (rev 7808)
+++ branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_sigframe/sigframe-x86-linux.c 2008-03-29 14:08:12 UTC (rev 7809)
@@ -99,7 +99,8 @@
/* XXX This is wrong. Surely we should store the shadow values
into the shadow memory behind the actual values? */
- VexGuestX86State vex_shadow;
+ VexGuestX86State vex_shadow1;
+ VexGuestX86State vex_shadow2;
/* HACK ALERT */
VexGuestX86State vex;
@@ -443,7 +444,8 @@
{
frame->sigNo_private = sigNo;
frame->magicPI = 0x31415927;
- frame->vex_shadow = tst->arch.vex_shadow;
+ frame->vex_shadow1 = tst->arch.vex_shadow1;
+ frame->vex_shadow2 = tst->arch.vex_shadow2;
/* HACK ALERT */
frame->vex = tst->arch.vex;
/* end HACK ALERT */
@@ -622,13 +624,14 @@
*sigNo = VKI_SIGSEGV;
return False;
}
- tst->sig_mask = frame->mask;
- tst->tmp_sig_mask = frame->mask;
- tst->arch.vex_shadow = frame->vex_shadow;
+ tst->sig_mask = frame->mask;
+ tst->tmp_sig_mask = frame->mask;
+ tst->arch.vex_shadow1 = frame->vex_shadow1;
+ tst->arch.vex_shadow2 = frame->vex_shadow2;
/* HACK ALERT */
- tst->arch.vex = frame->vex;
+ tst->arch.vex = frame->vex;
/* end HACK ALERT */
- *sigNo = frame->sigNo_private;
+ *sigNo = frame->sigNo_private;
return True;
}
Modified: branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_syswrap/syswrap-amd64-linux.c
===================================================================
--- branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_syswrap/syswrap-amd64-linux.c 2008-03-29 13:38:48 UTC (rev 7808)
+++ branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_syswrap/syswrap-amd64-linux.c 2008-03-29 14:08:12 UTC (rev 7809)
@@ -322,7 +322,8 @@
{
/* We inherit our parent's guest state. */
child->vex = parent->vex;
- child->vex_shadow = parent->vex_shadow;
+ child->vex_shadow1 = parent->vex_shadow1;
+ child->vex_shadow2 = parent->vex_shadow2;
}
Modified: branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_syswrap/syswrap-x86-linux.c
===================================================================
--- branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_syswrap/syswrap-x86-linux.c 2008-03-29 13:38:48 UTC (rev 7808)
+++ branches/OTRACK_BY_INSTRUMENTATION/coregrind/m_syswrap/syswrap-x86-linux.c 2008-03-29 14:08:12 UTC (rev 7809)
@@ -732,7 +732,8 @@
{
/* We inherit our parent's guest state. */
child->vex = parent->vex;
- child->vex_shadow = parent->vex_shadow;
+ child->vex_shadow1 = parent->vex_shadow1;
+ child->vex_shadow2 = parent->vex_shadow2;
/* We inherit our parent's LDT. */
if (parent->vex.guest_LDT == (HWord)NULL) {
Modified: branches/OTRACK_BY_INSTRUMENTATION/coregrind/pub_core_threadstate.h
===================================================================
--- branches/OTRACK_BY_INSTRUMENTATION/coregrind/pub_core_threadstate.h 2008-03-29 13:38:48 UTC (rev 7808)
+++ branches/OTRACK_BY_INSTRUMENTATION/coregrind/pub_core_threadstate.h 2008-03-29 14:08:12 UTC (rev 7809)
@@ -96,8 +96,9 @@
/* Saved machine context. */
VexGuestArchState vex;
- /* Saved shadow context. */
- VexGuestArchState vex_shadow;
+ /* Saved shadow context (2 copies). */
+ VexGuestArchState vex_shadow1;
+ VexGuestArchState vex_shadow2;
/* Spill area. */
UChar vex_spill[LibVEX_N_SPILL_BYTES];
Modified: branches/OTRACK_BY_INSTRUMENTATION/include/pub_tool_machine.h
===================================================================
--- branches/OTRACK_BY_INSTRUMENTATION/include/pub_tool_machine.h 2008-03-29 13:38:48 UTC (rev 7808)
+++ branches/OTRACK_BY_INSTRUMENTATION/include/pub_tool_machine.h 2008-03-29 14:08:12 UTC (rev 7809)
@@ -83,10 +83,14 @@
// For get/set, 'area' is where the asked-for shadow state will be copied
// into/from.
-extern void VG_(get_shadow_regs_area) ( ThreadId tid, OffT guest_state_offset,
- SizeT size, UChar* area );
-extern void VG_(set_shadow_regs_area) ( ThreadId tid, OffT guest_state_offset,
- SizeT size, const UChar* area );
+void
+VG_(get_shadow_regs_area) ( ThreadId tid,
+ /*DST*/UChar* dst,
+ /*SRC*/Int shadowNo, OffT offset, SizeT size );
+void
+VG_(set_shadow_regs_area) ( ThreadId tid,
+ /*DST*/Int shadowNo, OffT offset, SizeT size,
+ /*SRC*/const UChar* src );
// Apply a function 'f' to all the general purpose registers in all the
// current threads.
|
|
From: <sv...@va...> - 2008-03-29 14:02:57
|
Author: sewardj
Date: 2008-03-29 14:02:57 +0000 (Sat, 29 Mar 2008)
New Revision: 1815
Log:
Add a new primop, 32-bit unsigned max, as that is useful for
propogating origin tags. And it makes it easy to fold out unnecessary
instrumentation code.
Modified:
branches/OTRACK_BY_INSTRUMENTATION/priv/host-x86/isel.c
branches/OTRACK_BY_INSTRUMENTATION/priv/ir/irdefs.c
branches/OTRACK_BY_INSTRUMENTATION/priv/ir/iropt.c
branches/OTRACK_BY_INSTRUMENTATION/pub/libvex_ir.h
Modified: branches/OTRACK_BY_INSTRUMENTATION/priv/host-x86/isel.c
===================================================================
--- branches/OTRACK_BY_INSTRUMENTATION/priv/host-x86/isel.c 2008-03-29 14:01:51 UTC (rev 1814)
+++ branches/OTRACK_BY_INSTRUMENTATION/priv/host-x86/isel.c 2008-03-29 14:02:57 UTC (rev 1815)
@@ -925,6 +925,16 @@
return dst;
}
+ if (e->Iex.Binop.op == Iop_Max32U) {
+ HReg src1 = iselIntExpr_R(env, e->Iex.Binop.arg1);
+ HReg dst = newVRegI(env);
+ HReg src2 = iselIntExpr_R(env, e->Iex.Binop.arg2);
+ addInstr(env, mk_iMOVsd_RR(src1,dst));
+ addInstr(env, X86Instr_Alu32R(Xalu_CMP, X86RMI_Reg(src2), dst));
+ addInstr(env, X86Instr_CMov32(Xcc_B, X86RM_Reg(src2), dst));
+ return dst;
+ }
+
/* Handle misc other ops. */
if (e->Iex.Binop.op == Iop_8HLto16) {
HReg hi8 = newVRegI(env);
Modified: branches/OTRACK_BY_INSTRUMENTATION/priv/ir/irdefs.c
===================================================================
--- branches/OTRACK_BY_INSTRUMENTATION/priv/ir/irdefs.c 2008-03-29 14:01:51 UTC (rev 1814)
+++ branches/OTRACK_BY_INSTRUMENTATION/priv/ir/irdefs.c 2008-03-29 14:02:57 UTC (rev 1815)
@@ -210,6 +210,7 @@
case Iop_Left16: vex_printf("Left16"); return;
case Iop_Left32: vex_printf("Left32"); return;
case Iop_Left64: vex_printf("Left64"); return;
+ case Iop_Max32U: vex_printf("Max32U"); return;
case Iop_CmpORD32U: vex_printf("CmpORD32U"); return;
case Iop_CmpORD32S: vex_printf("CmpORD32S"); return;
@@ -1498,6 +1499,7 @@
case Iop_CmpORD32S:
case Iop_Add32: case Iop_Sub32: case Iop_Mul32:
case Iop_Or32: case Iop_And32: case Iop_Xor32:
+ case Iop_Max32U:
BINARY(Ity_I32,Ity_I32, Ity_I32);
case Iop_Add64: case Iop_Sub64: case Iop_Mul64:
Modified: branches/OTRACK_BY_INSTRUMENTATION/priv/ir/iropt.c
===================================================================
--- branches/OTRACK_BY_INSTRUMENTATION/priv/ir/iropt.c 2008-03-29 14:01:51 UTC (rev 1814)
+++ branches/OTRACK_BY_INSTRUMENTATION/priv/ir/iropt.c 2008-03-29 14:02:57 UTC (rev 1815)
@@ -1421,8 +1421,9 @@
e2 = e->Iex.Binop.arg1;
} else
- /* Or32/Add32(x,0) ==> x */
- if ((e->Iex.Binop.op == Iop_Add32 || e->Iex.Binop.op == Iop_Or32)
+ /* Or32/Add32/Max32U(x,0) ==> x */
+ if ((e->Iex.Binop.op == Iop_Add32
+ || e->Iex.Binop.op == Iop_Or32 || e->Iex.Binop.op == Iop_Max32U)
&& e->Iex.Binop.arg2->tag == Iex_Const
&& e->Iex.Binop.arg2->Iex.Const.con->Ico.U32 == 0) {
e2 = e->Iex.Binop.arg1;
@@ -1500,8 +1501,8 @@
e2 = e->Iex.Binop.arg2;
} else
- /* Or32(0,x) ==> x */
- if (e->Iex.Binop.op == Iop_Or32
+ /* Or32/Max32U(0,x) ==> x */
+ if ((e->Iex.Binop.op == Iop_Or32 || e->Iex.Binop.op == Iop_Max32U)
&& e->Iex.Binop.arg1->tag == Iex_Const
&& e->Iex.Binop.arg1->Iex.Const.con->Ico.U32 == 0) {
e2 = e->Iex.Binop.arg2;
Modified: branches/OTRACK_BY_INSTRUMENTATION/pub/libvex_ir.h
===================================================================
--- branches/OTRACK_BY_INSTRUMENTATION/pub/libvex_ir.h 2008-03-29 14:01:51 UTC (rev 1814)
+++ branches/OTRACK_BY_INSTRUMENTATION/pub/libvex_ir.h 2008-03-29 14:02:57 UTC (rev 1815)
@@ -446,6 +446,7 @@
Iop_CmpNEZ8, Iop_CmpNEZ16, Iop_CmpNEZ32, Iop_CmpNEZ64,
Iop_CmpwNEZ32, Iop_CmpwNEZ64, /* all-0s -> all-Os; other -> all-1s */
Iop_Left8, Iop_Left16, Iop_Left32, Iop_Left64, /* \x -> x | -x */
+ Iop_Max32U, /* unsigned max */
/* PowerPC-style 3-way integer comparisons. Without them it is
difficult to simulate PPC efficiently.
|
|
From: <sv...@va...> - 2008-03-29 14:01:51
|
Author: sewardj
Date: 2008-03-29 14:01:51 +0000 (Sat, 29 Mar 2008)
New Revision: 1814
Log:
Add support for a second set of register shadows in vex.
Astonishingly this seems to be the only required change.
Modified:
branches/OTRACK_BY_INSTRUMENTATION/priv/host-generic/reg_alloc2.c
Modified: branches/OTRACK_BY_INSTRUMENTATION/priv/host-generic/reg_alloc2.c
===================================================================
--- branches/OTRACK_BY_INSTRUMENTATION/priv/host-generic/reg_alloc2.c 2008-03-29 12:58:42 UTC (rev 1813)
+++ branches/OTRACK_BY_INSTRUMENTATION/priv/host-generic/reg_alloc2.c 2008-03-29 14:01:51 UTC (rev 1814)
@@ -849,9 +849,9 @@
}
/* This reflects LibVEX's hard-wired knowledge of the baseBlock
- layout: the guest state, then an equal sized area following
- it for shadow state, and then the spill area. */
- vreg_lrs[j].spill_offset = toShort(guest_sizeB * 2 + k * 8);
+ layout: the guest state, then two equal sized areas following
+ it for two sets of shadow state, and then the spill area. */
+ vreg_lrs[j].spill_offset = toShort(guest_sizeB * 3 + k * 8);
/* if (j > max_ss_no) */
/* max_ss_no = j; */
|
|
From: <sv...@va...> - 2008-03-29 13:38:43
|
Author: sewardj Date: 2008-03-29 13:38:48 +0000 (Sat, 29 Mar 2008) New Revision: 7808 Log: Swizzle external. Modified: branches/OTRACK_BY_INSTRUMENTATION/ Property changes on: branches/OTRACK_BY_INSTRUMENTATION ___________________________________________________________________ Name: svn:externals - VEX svn://svn.valgrind.org/vex/trunk + VEX svn://svn.valgrind.org/vex/branches/OTRACK_BY_INSTRUMENTATION |
|
From: <sv...@va...> - 2008-03-29 13:34:52
|
Author: sewardj Date: 2008-03-29 13:34:57 +0000 (Sat, 29 Mar 2008) New Revision: 7807 Log: Make a copy of trunk r7806 for experimentation with instrumentation-based origin tracking (for Memcheck). Added: branches/OTRACK_BY_INSTRUMENTATION/ Copied: branches/OTRACK_BY_INSTRUMENTATION (from rev 7806, trunk) |
|
From: Julian S. <js...@ac...> - 2008-03-29 13:33:09
|
> First is easy if we know the address to trace (with --trace-addr) > before we start Helgrind. But we usually don't. :( Would this help? Once an address is marked as SHVAL_Race, start collecting more info about it. In particular, record stack traces for the next N (say 100) memory accesses to it, or maybe better a stack trace for the first access to it from each different thread. Or some variant of these. This doesn't help find the first access to an address in a race. But on the assumption that most races happen > 1 time (as reported in the Rodehoffer "Racetrack" paper) then this might be an easy way to find some other places where the address is accessed. J |
|
From: <sv...@va...> - 2008-03-29 13:17:58
|
Author: bart
Date: 2008-03-29 13:18:02 +0000 (Sat, 29 Mar 2008)
New Revision: 7806
Log:
Changed meaning of the second argument of the start/stop suppression client requests from "end address" to "size in bytes".
Modified:
trunk/exp-drd/drd_clientreq.c
trunk/exp-drd/drd_clientreq.h
trunk/exp-drd/drd_pthread_intercepts.c
Modified: trunk/exp-drd/drd_clientreq.c
===================================================================
--- trunk/exp-drd/drd_clientreq.c 2008-03-29 13:13:33 UTC (rev 7805)
+++ trunk/exp-drd/drd_clientreq.c 2008-03-29 13:18:02 UTC (rev 7806)
@@ -94,11 +94,11 @@
break;
case VG_USERREQ__DRD_START_SUPPRESSION:
- drd_start_suppression(arg[1], arg[2], "client");
+ drd_start_suppression(arg[1], arg[1] + arg[2], "client");
break;
case VG_USERREQ__DRD_FINISH_SUPPRESSION:
- drd_finish_suppression(arg[1], arg[2]);
+ drd_finish_suppression(arg[1], arg[1] + arg[2]);
break;
case VG_USERREQ__DRD_SUPPRESS_CURRENT_STACK:
Modified: trunk/exp-drd/drd_clientreq.h
===================================================================
--- trunk/exp-drd/drd_clientreq.h 2008-03-29 13:13:33 UTC (rev 7805)
+++ trunk/exp-drd/drd_clientreq.h 2008-03-29 13:18:02 UTC (rev 7806)
@@ -13,11 +13,11 @@
/* To tell the drd tool to suppress data race detection on the specified */
/* address range. */
VG_USERREQ__DRD_START_SUPPRESSION,
- /* args: start address, end address */
+ /* args: start address, size in bytes */
/* To tell the drd tool no longer to suppress data race detection on the */
/* specified address range. */
VG_USERREQ__DRD_FINISH_SUPPRESSION,
- /* args: start address, end address */
+ /* args: start address, size in bytes */
/* Ask drd to suppress data race reports on all currently allocated stack */
/* data of the current thread. */
VG_USERREQ__DRD_SUPPRESS_CURRENT_STACK,
Modified: trunk/exp-drd/drd_pthread_intercepts.c
===================================================================
--- trunk/exp-drd/drd_pthread_intercepts.c 2008-03-29 13:13:33 UTC (rev 7805)
+++ trunk/exp-drd/drd_pthread_intercepts.c 2008-03-29 13:18:02 UTC (rev 7806)
@@ -125,7 +125,7 @@
{
int res;
VALGRIND_DO_CLIENT_REQUEST(res, 0, VG_USERREQ__DRD_START_SUPPRESSION,
- p, (char*)p + size, 0, 0, 0);
+ p, size, 0, 0, 0);
}
static void vg_set_joinable(const pthread_t tid, const int joinable)
|
|
From: <sv...@va...> - 2008-03-29 13:13:29
|
Author: bart
Date: 2008-03-29 13:13:33 +0000 (Sat, 29 Mar 2008)
New Revision: 7805
Log:
Comment-only fix.
Modified:
trunk/exp-drd/drd_thread.h
Modified: trunk/exp-drd/drd_thread.h
===================================================================
--- trunk/exp-drd/drd_thread.h 2008-03-29 12:54:01 UTC (rev 7804)
+++ trunk/exp-drd/drd_thread.h 2008-03-29 13:13:33 UTC (rev 7805)
@@ -172,7 +172,10 @@
#endif
s_threadinfo[tid].stack_min = stack_min;
#if 0
- tl_assert(s_threadinfo[tid].stack_min < s_threadinfo[tid].stack_max);
+ /* This function can be called after the thread has been created but */
+ /* before drd_post_thread_create() has filled in stack_max. */
+ tl_assert(s_threadinfo[tid].stack_min < s_threadinfo[tid].stack_max
+ || s_threadinfo[tid].stack_max == 0);
#endif
if (UNLIKELY(stack_min < s_threadinfo[tid].stack_min_min))
{
|
|
From: Julian S. <js...@ac...> - 2008-03-29 13:12:09
|
> The peephole optimizer I described earlier. It does some coalescing and > removes redudant moves between virtual registers. On code instrumented with > memcheck it can reduce the number of reg-allocated instructions by up to > 12%. > > All the regression tests pass after applying these patches (except those > that didn't pass before applying the patches). What about something really large, like konqueror, mozilla, OOo? Do you have some more comprehensive before/after numbers? * what are the before/after code expansion ratios for apps as a whole, as shown by these lines (run with -v) ? --8732-- transtab: new 3,095 (68,098 -> 1,067,412; ratio 156:10) * what are the actual measured performance effects? Have you made friends yet with 'make perf' ? J |
|
From: <sv...@va...> - 2008-03-29 12:58:39
|
Author: sewardj Date: 2008-03-29 12:58:42 +0000 (Sat, 29 Mar 2008) New Revision: 1813 Log: Make a copy of r1812 for experimentation with instrumentation-based origin tracking (as opposed to value-piggybacking-based origin tracking). Added: branches/OTRACK_BY_INSTRUMENTATION/ Copied: branches/OTRACK_BY_INSTRUMENTATION (from rev 1812, trunk) |
|
From: <sv...@va...> - 2008-03-29 12:54:01
|
Author: bart
Date: 2008-03-29 12:54:01 +0000 (Sat, 29 Mar 2008)
New Revision: 7804
Log:
Minor optimization: eliminated an if-statement.
Modified:
trunk/exp-drd/drd_thread.h
Modified: trunk/exp-drd/drd_thread.h
===================================================================
--- trunk/exp-drd/drd_thread.h 2008-03-29 11:03:38 UTC (rev 7803)
+++ trunk/exp-drd/drd_thread.h 2008-03-29 12:54:01 UTC (rev 7804)
@@ -170,16 +170,13 @@
#if 0
tl_assert(0 <= tid && tid < DRD_N_THREADS && tid != DRD_INVALID_THREADID);
#endif
- if (s_threadinfo[tid].stack_max)
- {
- s_threadinfo[tid].stack_min = stack_min;
+ s_threadinfo[tid].stack_min = stack_min;
#if 0
- tl_assert(s_threadinfo[tid].stack_min < s_threadinfo[tid].stack_max);
+ tl_assert(s_threadinfo[tid].stack_min < s_threadinfo[tid].stack_max);
#endif
- if (UNLIKELY(stack_min < s_threadinfo[tid].stack_min_min))
- {
- s_threadinfo[tid].stack_min_min = stack_min;
- }
+ if (UNLIKELY(stack_min < s_threadinfo[tid].stack_min_min))
+ {
+ s_threadinfo[tid].stack_min_min = stack_min;
}
}
|
|
From: Bart V. A. <bar...@gm...> - 2008-03-29 12:39:39
|
On Sat, Mar 29, 2008 at 12:26 AM, Julian Seward <js...@ac...> wrote: > > Konstantin wrote: > > > I'd like to collect ideas regarding the subject raised today in a > > separate thread: how to decipher Helgrind's reports about 'Possible > > data race'. > > That is an excellent question; unfortunately not easy to answer. > > Let me ask a related question. In a way it is chasing the problem > from the other end. Question is: In an ideal world (no constraints > on CPU time or memory), what information would make it easy to > find the root cause of race reports? What definitely helps is the stack traces (two or more) of all conflicting accesses and the allocation context of the address on which the conflict happened. This is sufficient for identifying the source code statements causing the conflict. Solving a data race properly can be more difficult. Sometimes basic knowledge of the software you are analyzing is sufficient, sometimes you need a deep understanding of the software. Adding more tracing always helps understanding complex cases. Bart. |
|
From: <sv...@va...> - 2008-03-29 11:03:34
|
Author: sewardj Date: 2008-03-29 11:03:38 +0000 (Sat, 29 Mar 2008) New Revision: 7803 Log: Add notes on how to hack on OOo without having excessive delays caused by either (1) having to reinstall having rebuilt, or (2) by having 'make' walk over the entire massive source tree to decide what to rebuild following a 1-line change. With help from Michael Meeks. Modified: branches/HGDEV/docs/internals/BIG_APP_NOTES.txt Modified: branches/HGDEV/docs/internals/BIG_APP_NOTES.txt =================================================================== --- branches/HGDEV/docs/internals/BIG_APP_NOTES.txt 2008-03-29 09:31:43 UTC (rev 7802) +++ branches/HGDEV/docs/internals/BIG_APP_NOTES.txt 2008-03-29 11:03:38 UTC (rev 7803) @@ -75,6 +75,8 @@ ./autogen.sh --with-distro=SUSE-10.2 --with-java=no --disable-gstreamer --disable-mono --with-max-jobs=2 --with-num-cpus=2 +# --with-alloc=system is used by default + ./download make @@ -97,3 +99,25 @@ cd ~/Tools/OOPlay/Inst01 valgrind -v ./program/soffice.bin + +# Hacking OOo + +# Use two shells, (C)ompile and (R)un. In (C): +# +cd build/ooh680-m12 +. ./LinuxX86Env.Set.sh +solenv/bin/linkoo ~/Tools/OOPlay/Inst01 +# +# This replaces all the .so's in the install tree with symlinks +# back into the build tree, so you can then re-run without +# having to endlessly reinstall. It also creates 'ooenv' in +# ~/Tools/OOPlay/Inst01/program, which needs to be sourced +# once before running. +# +# So having changed something in OOo, eg in svx/, do: +# +(cd svx && build) +# +# Meanwhile in the (R)un shell: +source ooenv # just once! +valgrind [args] ./soffice.bin |
|
From: <sv...@va...> - 2008-03-29 09:31:39
|
Author: bart
Date: 2008-03-29 09:31:43 +0000 (Sat, 29 Mar 2008)
New Revision: 7802
Log:
Added command line option --show-stack-usage.
Modified:
trunk/exp-drd/drd_main.c
Modified: trunk/exp-drd/drd_main.c
===================================================================
--- trunk/exp-drd/drd_main.c 2008-03-29 09:28:12 UTC (rev 7801)
+++ trunk/exp-drd/drd_main.c 2008-03-29 09:31:43 UTC (rev 7802)
@@ -61,11 +61,12 @@
// Local variables.
-static Bool drd_print_stats = False;
+static Bool drd_print_stats = False;
static Bool drd_trace_fork_join = False;
-static Bool drd_trace_mem = False;
-static Addr drd_trace_address = 0;
-static Bool s_drd_var_info = False;
+static Bool drd_trace_mem = False;
+static Addr drd_trace_address = 0;
+static Bool s_drd_var_info = False;
+static Bool s_show_stack_usage = False;
//
@@ -91,6 +92,7 @@
VG_BOOL_CLO (arg, "--drd-stats", drd_print_stats)
else VG_BOOL_CLO(arg, "--segment-merging", segment_merging)
else VG_BOOL_CLO(arg, "--show-confl-seg", show_confl_seg)
+ else VG_BOOL_CLO(arg, "--show-stack-usage", s_show_stack_usage)
else VG_BOOL_CLO(arg, "--trace-barrier", trace_barrier)
else VG_BOOL_CLO(arg, "--trace-clientobj", trace_clientobj)
else VG_BOOL_CLO(arg, "--trace-cond", trace_cond)
@@ -613,6 +615,23 @@
thread_get_joinable(drd_tid)
? ""
: " (which is a detached thread)");
+ }
+ if (s_show_stack_usage)
+ {
+ const SizeT stack_size = thread_get_stack_size(drd_tid);
+ const SizeT used_stack
+ = thread_get_stack_max(drd_tid) - thread_get_stack_min_min(drd_tid);
+ VG_(message)(Vg_UserMsg,
+ "thread %d/%d%s finished and used %ld bytes out of %ld"
+ " on its stack. Margin: %ld bytes.",
+ vg_tid,
+ drd_tid,
+ thread_get_joinable(drd_tid)
+ ? ""
+ : " (which is a detached thread)",
+ used_stack,
+ stack_size,
+ stack_size - used_stack);
}
drd_stop_using_mem(thread_get_stack_min(drd_tid),
|
|
From: <sv...@va...> - 2008-03-29 09:28:09
|
Author: bart
Date: 2008-03-29 09:28:12 +0000 (Sat, 29 Mar 2008)
New Revision: 7801
Log:
Stack size is now specified at thread creation time.
Modified:
trunk/exp-drd/tests/matinv.c
Modified: trunk/exp-drd/tests/matinv.c
===================================================================
--- trunk/exp-drd/tests/matinv.c 2008-03-29 09:27:08 UTC (rev 7800)
+++ trunk/exp-drd/tests/matinv.c 2008-03-29 09:28:12 UTC (rev 7801)
@@ -226,6 +226,8 @@
int i;
struct gj_threadinfo* t;
pthread_barrier_t b;
+ pthread_attr_t attr;
+ int err;
assert(rows <= cols);
@@ -233,6 +235,11 @@
pthread_barrier_init(&b, 0, s_nthread);
+ pthread_attr_init(&attr);
+ /* To do: replace the stack size argument by PTHREAD_STACK_MIN + 4096. */
+ err = pthread_attr_setstacksize(&attr, 32768);
+ assert(err == 0);
+
for (i = 0; i < s_nthread; i++)
{
t[i].b = &b;
@@ -241,9 +248,11 @@
t[i].cols = cols;
t[i].r0 = i * rows / s_nthread;
t[i].r1 = (i+1) * rows / s_nthread;
- pthread_create(&t[i].tid, 0, (void*(*)(void*))gj_threadfunc, &t[i]);
+ pthread_create(&t[i].tid, &attr, (void*(*)(void*))gj_threadfunc, &t[i]);
}
+ pthread_attr_destroy(&attr);
+
for (i = 0; i < s_nthread; i++)
{
pthread_join(t[i].tid, 0);
|
|
From: <sv...@va...> - 2008-03-29 09:27:03
|
Author: bart
Date: 2008-03-29 09:27:08 +0000 (Sat, 29 Mar 2008)
New Revision: 7800
Log:
Added thread_get_stack_size() and thread_get_stack_min_min().
Modified:
trunk/exp-drd/drd_thread.c
trunk/exp-drd/drd_thread.h
Modified: trunk/exp-drd/drd_thread.c
===================================================================
--- trunk/exp-drd/drd_thread.c 2008-03-29 09:25:53 UTC (rev 7799)
+++ trunk/exp-drd/drd_thread.c 2008-03-29 09:27:08 UTC (rev 7800)
@@ -127,6 +127,7 @@
s_threadinfo[i].vg_threadid = tid;
s_threadinfo[i].pt_threadid = INVALID_POSIX_THREADID;
s_threadinfo[i].stack_min = 0;
+ s_threadinfo[i].stack_min_min = 0;
s_threadinfo[i].stack_startup = 0;
s_threadinfo[i].stack_max = 0;
s_threadinfo[i].is_recording = True;
@@ -221,6 +222,8 @@
s_threadinfo[created].stack_max = VG_(thread_get_stack_max)(vg_created);
s_threadinfo[created].stack_startup = s_threadinfo[created].stack_max;
s_threadinfo[created].stack_min = s_threadinfo[created].stack_max;
+ s_threadinfo[created].stack_min_min = s_threadinfo[created].stack_max;
+ s_threadinfo[created].stack_size = VG_(thread_get_stack_size)(vg_created);
tl_assert(s_threadinfo[created].stack_max != 0);
return created;
@@ -245,6 +248,13 @@
return s_threadinfo[tid].stack_min;
}
+Addr thread_get_stack_min_min(const DrdThreadId tid)
+{
+ tl_assert(0 <= tid && tid < DRD_N_THREADS
+ && tid != DRD_INVALID_THREADID);
+ return s_threadinfo[tid].stack_min_min;
+}
+
Addr thread_get_stack_max(const DrdThreadId tid)
{
tl_assert(0 <= tid && tid < DRD_N_THREADS
@@ -252,6 +262,13 @@
return s_threadinfo[tid].stack_max;
}
+SizeT thread_get_stack_size(const DrdThreadId tid)
+{
+ tl_assert(0 <= tid && tid < DRD_N_THREADS
+ && tid != DRD_INVALID_THREADID);
+ return s_threadinfo[tid].stack_size;
+}
+
/** Clean up thread-specific data structures. Call this just after
* pthread_join().
*/
Modified: trunk/exp-drd/drd_thread.h
===================================================================
--- trunk/exp-drd/drd_thread.h 2008-03-29 09:25:53 UTC (rev 7799)
+++ trunk/exp-drd/drd_thread.h 2008-03-29 09:27:08 UTC (rev 7800)
@@ -60,9 +60,11 @@
Segment* last;
ThreadId vg_threadid;
PThreadId pt_threadid;
- Addr stack_min;
- Addr stack_startup;
- Addr stack_max;
+ Addr stack_min_min; /** Lowest value stack pointer ever had. */
+ Addr stack_min; /** Current stack pointer. */
+ Addr stack_startup; /** Stack pointer after pthread_create() finished.*/
+ Addr stack_max; /** Top of stack. */
+ SizeT stack_size; /** Maximum size of stack. */
/// Indicates whether the Valgrind core knows about this thread.
Bool vg_thread_exists;
/// Indicates whether there is an associated POSIX thread ID.
@@ -103,7 +105,9 @@
void thread_finished(const DrdThreadId tid);
void thread_set_stack_startup(const DrdThreadId tid, const Addr stack_startup);
Addr thread_get_stack_min(const DrdThreadId tid);
+Addr thread_get_stack_min_min(const DrdThreadId tid);
Addr thread_get_stack_max(const DrdThreadId tid);
+SizeT thread_get_stack_size(const DrdThreadId tid);
void thread_set_pthreadid(const DrdThreadId tid, const PThreadId ptid);
Bool thread_get_joinable(const DrdThreadId tid);
void thread_set_joinable(const DrdThreadId tid, const Bool joinable);
@@ -172,6 +176,10 @@
#if 0
tl_assert(s_threadinfo[tid].stack_min < s_threadinfo[tid].stack_max);
#endif
+ if (UNLIKELY(stack_min < s_threadinfo[tid].stack_min_min))
+ {
+ s_threadinfo[tid].stack_min_min = stack_min;
+ }
}
}
|
|
From: <sv...@va...> - 2008-03-29 09:25:48
|
Author: bart
Date: 2008-03-29 09:25:53 +0000 (Sat, 29 Mar 2008)
New Revision: 7799
Log:
Added VG_(thread_get_stack_size)().
Modified:
trunk/coregrind/m_machine.c
trunk/include/pub_tool_machine.h
Modified: trunk/coregrind/m_machine.c
===================================================================
--- trunk/coregrind/m_machine.c 2008-03-29 09:25:11 UTC (rev 7798)
+++ trunk/coregrind/m_machine.c 2008-03-29 09:25:53 UTC (rev 7799)
@@ -223,6 +223,13 @@
return VG_(threads)[tid].client_stack_highest_word;
}
+SizeT VG_(thread_get_stack_size)(ThreadId tid)
+{
+ vg_assert(0 <= tid && tid < VG_N_THREADS && tid != VG_INVALID_THREADID);
+ vg_assert(VG_(threads)[tid].status != VgTs_Empty);
+ return VG_(threads)[tid].client_stack_szB;
+}
+
//-------------------------------------------------------------
/* Details about the capabilities of the underlying (host) CPU. These
details are acquired by (1) enquiring with the CPU at startup, or
Modified: trunk/include/pub_tool_machine.h
===================================================================
--- trunk/include/pub_tool_machine.h 2008-03-29 09:25:11 UTC (rev 7798)
+++ trunk/include/pub_tool_machine.h 2008-03-29 09:25:53 UTC (rev 7799)
@@ -105,6 +105,9 @@
// Returns .client_stack_highest_word for the given thread
extern Addr VG_(thread_get_stack_max) ( ThreadId tid );
+// Returns how many bytes have been allocated for the stack of the given thread
+extern Addr VG_(thread_get_stack_size) ( ThreadId tid );
+
// Given a pointer to a function as obtained by "& functionname" in C,
// produce a pointer to the actual entry point for the function. For
// most platforms it's the identity function. Unfortunately, on
|
|
From: <sv...@va...> - 2008-03-29 09:25:06
|
Author: bart
Date: 2008-03-29 09:25:11 +0000 (Sat, 29 Mar 2008)
New Revision: 7798
Log:
Fixed a comment.
Modified:
trunk/coregrind/pub_core_threadstate.h
Modified: trunk/coregrind/pub_core_threadstate.h
===================================================================
--- trunk/coregrind/pub_core_threadstate.h 2008-03-29 08:34:03 UTC (rev 7797)
+++ trunk/coregrind/pub_core_threadstate.h 2008-03-29 09:25:11 UTC (rev 7798)
@@ -194,8 +194,7 @@
apply. We don't know the size of the stack since we didn't
allocate it, and furthermore we never reallocate it. */
- /* The allocated size of this thread's stack (permanently zero
- if this is ThreadId == 1, since we didn't allocate its stack) */
+ /* The allocated size of this thread's stack */
SizeT client_stack_szB;
/* Address of the highest legitimate word in this stack. This is
|
|
From: <sv...@va...> - 2008-03-29 08:34:00
|
Author: bart
Date: 2008-03-29 08:34:03 +0000 (Sat, 29 Mar 2008)
New Revision: 7797
Log:
Added command line option --var-info. Reading debug info for client variables is now disabled by default.
Modified:
trunk/exp-drd/drd_main.c
trunk/exp-drd/tests/fp_race.vgtest
trunk/exp-drd/tests/hg03_inherit.vgtest
trunk/exp-drd/tests/hg04_race.vgtest
trunk/exp-drd/tests/hg05_race2.vgtest
trunk/exp-drd/tests/pth_detached2.vgtest
trunk/exp-drd/tests/rwlock_race.vgtest
trunk/exp-drd/tests/sem_as_mutex.vgtest
trunk/exp-drd/tests/tc01_simple_race.vgtest
trunk/exp-drd/tests/tc16_byterace.vgtest
trunk/exp-drd/tests/tc20_verifywrap.vgtest
trunk/exp-drd/tests/tc20_verifywrap2.vgtest
Modified: trunk/exp-drd/drd_main.c
===================================================================
--- trunk/exp-drd/drd_main.c 2008-03-29 08:32:30 UTC (rev 7796)
+++ trunk/exp-drd/drd_main.c 2008-03-29 08:34:03 UTC (rev 7797)
@@ -65,6 +65,7 @@
static Bool drd_trace_fork_join = False;
static Bool drd_trace_mem = False;
static Addr drd_trace_address = 0;
+static Bool s_drd_var_info = False;
//
@@ -102,6 +103,7 @@
else VG_BOOL_CLO(arg, "--trace-segment", trace_segment)
else VG_BOOL_CLO(arg, "--trace-semaphore", trace_semaphore)
else VG_BOOL_CLO(arg, "--trace-suppression", trace_suppression)
+ else VG_BOOL_CLO(arg, "--var-info", s_drd_var_info)
else VG_STR_CLO (arg, "--trace-address", trace_address)
else
return VG_(replacement_malloc_process_cmd_line_option)(arg);
@@ -727,6 +729,11 @@
# else
VG_(printf)("\nWARNING: DRD has only been tested on x86-linux and amd64-linux.\n\n");
# endif
+
+ if (s_drd_var_info)
+ {
+ VG_(needs_var_info)();
+ }
}
static void instrument_load(IRSB* const bb,
@@ -1038,8 +1045,6 @@
VG_(track_pre_thread_ll_exit) (drd_thread_finished);
// Other stuff.
- VG_(needs_var_info)();
-
drd_register_malloc_wrappers(drd_start_using_mem, drd_stop_using_mem);
drd_clientreq_init();
Modified: trunk/exp-drd/tests/fp_race.vgtest
===================================================================
--- trunk/exp-drd/tests/fp_race.vgtest 2008-03-29 08:32:30 UTC (rev 7796)
+++ trunk/exp-drd/tests/fp_race.vgtest 2008-03-29 08:34:03 UTC (rev 7797)
@@ -1,2 +1,3 @@
prereq: ./supported_libpthread
+vgopts: --var-info=yes
prog: fp_race
Modified: trunk/exp-drd/tests/hg03_inherit.vgtest
===================================================================
--- trunk/exp-drd/tests/hg03_inherit.vgtest 2008-03-29 08:32:30 UTC (rev 7796)
+++ trunk/exp-drd/tests/hg03_inherit.vgtest 2008-03-29 08:34:03 UTC (rev 7797)
@@ -1,3 +1,3 @@
prereq: ./supported_libpthread
+vgopts: --show-confl-seg=no --var-info=yes
prog: hg03_inherit
-vgopts: --show-confl-seg=no
Modified: trunk/exp-drd/tests/hg04_race.vgtest
===================================================================
--- trunk/exp-drd/tests/hg04_race.vgtest 2008-03-29 08:32:30 UTC (rev 7796)
+++ trunk/exp-drd/tests/hg04_race.vgtest 2008-03-29 08:34:03 UTC (rev 7797)
@@ -1,2 +1,3 @@
prereq: ./supported_libpthread
+vgopts: --var-info=yes
prog: hg04_race
Modified: trunk/exp-drd/tests/hg05_race2.vgtest
===================================================================
--- trunk/exp-drd/tests/hg05_race2.vgtest 2008-03-29 08:32:30 UTC (rev 7796)
+++ trunk/exp-drd/tests/hg05_race2.vgtest 2008-03-29 08:34:03 UTC (rev 7797)
@@ -1,2 +1,3 @@
prereq: ./supported_libpthread
+vgopts: --var-info=yes
prog: hg05_race2
Modified: trunk/exp-drd/tests/pth_detached2.vgtest
===================================================================
--- trunk/exp-drd/tests/pth_detached2.vgtest 2008-03-29 08:32:30 UTC (rev 7796)
+++ trunk/exp-drd/tests/pth_detached2.vgtest 2008-03-29 08:34:03 UTC (rev 7797)
@@ -1,3 +1,4 @@
prereq: ./supported_libpthread
+vgopts: --var-info=yes
prog: pth_detached
args: 10 10
Modified: trunk/exp-drd/tests/rwlock_race.vgtest
===================================================================
--- trunk/exp-drd/tests/rwlock_race.vgtest 2008-03-29 08:32:30 UTC (rev 7796)
+++ trunk/exp-drd/tests/rwlock_race.vgtest 2008-03-29 08:34:03 UTC (rev 7797)
@@ -1,2 +1,3 @@
prereq: ./supported_libpthread
+vgopts: --var-info=yes
prog: rwlock_race
Modified: trunk/exp-drd/tests/sem_as_mutex.vgtest
===================================================================
--- trunk/exp-drd/tests/sem_as_mutex.vgtest 2008-03-29 08:32:30 UTC (rev 7796)
+++ trunk/exp-drd/tests/sem_as_mutex.vgtest 2008-03-29 08:34:03 UTC (rev 7797)
@@ -1,2 +1,3 @@
prereq: ./supported_libpthread
+vgopts: --var-info=yes
prog: sem_as_mutex
Modified: trunk/exp-drd/tests/tc01_simple_race.vgtest
===================================================================
--- trunk/exp-drd/tests/tc01_simple_race.vgtest 2008-03-29 08:32:30 UTC (rev 7796)
+++ trunk/exp-drd/tests/tc01_simple_race.vgtest 2008-03-29 08:34:03 UTC (rev 7797)
@@ -1,2 +1,3 @@
prereq: ./supported_libpthread
+vgopts: --var-info=yes
prog: tc01_simple_race
Modified: trunk/exp-drd/tests/tc16_byterace.vgtest
===================================================================
--- trunk/exp-drd/tests/tc16_byterace.vgtest 2008-03-29 08:32:30 UTC (rev 7796)
+++ trunk/exp-drd/tests/tc16_byterace.vgtest 2008-03-29 08:34:03 UTC (rev 7797)
@@ -1,2 +1,3 @@
prereq: ./supported_libpthread
+vgopts: --var-info=yes
prog: tc16_byterace
Modified: trunk/exp-drd/tests/tc20_verifywrap.vgtest
===================================================================
--- trunk/exp-drd/tests/tc20_verifywrap.vgtest 2008-03-29 08:32:30 UTC (rev 7796)
+++ trunk/exp-drd/tests/tc20_verifywrap.vgtest 2008-03-29 08:34:03 UTC (rev 7797)
@@ -1,2 +1,3 @@
prereq: ./supported_libpthread
+vgopts: --var-info=yes
prog: tc20_verifywrap
Modified: trunk/exp-drd/tests/tc20_verifywrap2.vgtest
===================================================================
--- trunk/exp-drd/tests/tc20_verifywrap2.vgtest 2008-03-29 08:32:30 UTC (rev 7796)
+++ trunk/exp-drd/tests/tc20_verifywrap2.vgtest 2008-03-29 08:34:03 UTC (rev 7797)
@@ -1,3 +1,3 @@
prereq: ./supported_libpthread
+vgopts: --trace-mutex=yes --trace-cond=yes --trace-semaphore=yes --var-info=yes
prog: tc20_verifywrap
-vgopts: --trace-mutex=yes --trace-cond=yes --trace-semaphore=yes
|
|
From: <sv...@va...> - 2008-03-29 08:32:30
|
Author: bart
Date: 2008-03-29 08:32:30 +0000 (Sat, 29 Mar 2008)
New Revision: 7796
Log:
Minor update.
Modified:
trunk/exp-drd/Testing.txt
Modified: trunk/exp-drd/Testing.txt
===================================================================
--- trunk/exp-drd/Testing.txt 2008-03-28 01:07:37 UTC (rev 7795)
+++ trunk/exp-drd/Testing.txt 2008-03-29 08:32:30 UTC (rev 7796)
@@ -17,8 +17,7 @@
./vg-in-place --tool=exp-drd kate
./vg-in-place --trace-children=yes --tool=exp-drd knode
4. Test DRD with Firefox. First of all, build and install Firefox 3. Next,
- run one of the following commands:
- LD_LIBRARY_PATH=$HOME/firefox3/lib/firefox-3.0b4: ./vg-in-place --trace-children=yes --tool=exp-drd $HOME/firefox3/lib/firefox-3.0b4/firefox-bin
+ run the following command:
LD_LIBRARY_PATH=$HOME/software/mozilla-build/dist/lib: ./vg-in-place --trace-children=yes --tool=exp-drd $HOME/software/mozilla-build/dist/bin/firefox-bin
@@ -56,12 +55,11 @@
ac_add_options --enable-debug
ac_add_options --enable-static
ac_add_options --prefix $PREFIX
+ac_add_options --enable-optimize="-O1 -g -pipe"
EOF
-export CFLAGS=-pipe
-
${SRC}/configure
-make -s || exit $?
-make -s install || exit $?
+make -s -j2 || exit $?
+# make -s install || exit $?
------------------------------------------------------------
|
|
From: Konstantin S. <kon...@gm...> - 2008-03-29 07:14:52
|
> > I'd like to collect ideas regarding the subject raised today in a
> > separate thread: how to decipher Helgrind's reports about 'Possible
> > data race'.
>
> That is an excellent question; unfortunately not easy to answer.
>
> Let me ask a related question.
> In a way it is chasing the problem from the other end.
Right.
It's like to mince a force-meat backwards (my translation from Russian :))
> Question is: In an ideal world (no constraints
> on CPU time or memory), what information would make it easy to
> find the root cause of race reports?
I think this:
1: Record each memory access and allocation with
a) Stack trace
b) Thread and segment
c) List of held locks with stack traces of last acquisitions.
2: Complete happens-before graph where each segment is attributed with
stack trace of its beginning.
Second is easy, but less important.
First is easy if we know the address to trace (with --trace-addr)
before we start Helgrind. But we usually don't. :(
--kcc
|
|
From: Tom H. <th...@cy...> - 2008-03-29 05:55:39
|
Nightly build on alvis ( i686, Red Hat 7.3 ) started at 2008-03-29 03:15:03 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 330 tests, 76 stderr failures, 1 stdout failure, 29 post failures == memcheck/tests/addressable (stderr) memcheck/tests/badjump (stderr) memcheck/tests/describe-block (stderr) memcheck/tests/erringfds (stderr) memcheck/tests/leak-0 (stderr) memcheck/tests/leak-cycle (stderr) memcheck/tests/leak-pool-0 (stderr) memcheck/tests/leak-pool-1 (stderr) memcheck/tests/leak-pool-2 (stderr) memcheck/tests/leak-pool-3 (stderr) memcheck/tests/leak-pool-4 (stderr) memcheck/tests/leak-pool-5 (stderr) memcheck/tests/leak-regroot (stderr) memcheck/tests/leak-tree (stderr) memcheck/tests/long_namespace_xml (stderr) memcheck/tests/lsframe1 (stderr) memcheck/tests/lsframe2 (stderr) memcheck/tests/malloc_free_fill (stderr) memcheck/tests/match-overrun (stderr) memcheck/tests/noisy_child (stderr) memcheck/tests/partial_load_dflt (stderr) memcheck/tests/partial_load_ok (stderr) memcheck/tests/partiallydefinedeq (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/sigkill (stderr) memcheck/tests/stack_changes (stderr) memcheck/tests/varinfo1 (stderr) memcheck/tests/varinfo2 (stderr) memcheck/tests/varinfo3 (stderr) memcheck/tests/varinfo4 (stderr) memcheck/tests/varinfo5 (stderr) memcheck/tests/varinfo6 (stderr) memcheck/tests/x86/bug152022 (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/x86/scalar_supp (stderr) memcheck/tests/x86/xor-undef-x86 (stderr) memcheck/tests/xml1 (stderr) massif/tests/alloc-fns-A (post) massif/tests/alloc-fns-B (post) massif/tests/basic (post) massif/tests/basic2 (post) massif/tests/big-alloc (post) massif/tests/culling1 (stderr) massif/tests/culling2 (stderr) massif/tests/custom_alloc (post) massif/tests/deep-A (post) massif/tests/deep-B (stderr) massif/tests/deep-B (post) massif/tests/deep-C (stderr) massif/tests/deep-C (post) massif/tests/deep-D (post) massif/tests/ignoring (post) massif/tests/insig (post) massif/tests/long-names (post) massif/tests/long-time (post) massif/tests/new-cpp (post) massif/tests/null (post) massif/tests/one (post) massif/tests/overloaded-new (post) massif/tests/peak (post) massif/tests/peak2 (stderr) massif/tests/peak2 (post) massif/tests/realloc (stderr) massif/tests/realloc (post) massif/tests/thresholds_0_0 (post) massif/tests/thresholds_0_10 (post) massif/tests/thresholds_10_0 (post) massif/tests/thresholds_10_10 (post) massif/tests/thresholds_5_0 (post) massif/tests/thresholds_5_10 (post) massif/tests/zero1 (post) massif/tests/zero2 (post) none/tests/blockfault (stderr) none/tests/faultstatus (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) none/tests/shell (stderr) none/tests/shell_valid1 (stderr) none/tests/shell_valid2 (stderr) none/tests/shell_valid3 (stderr) helgrind/tests/hg01_all_ok (stderr) helgrind/tests/hg02_deadlock (stderr) helgrind/tests/hg03_inherit (stderr) helgrind/tests/hg04_race (stderr) helgrind/tests/hg05_race2 (stderr) helgrind/tests/hg06_readshared (stderr) helgrind/tests/tc01_simple_race (stderr) helgrind/tests/tc02_simple_tls (stderr) helgrind/tests/tc03_re_excl (stderr) helgrind/tests/tc05_simple_race (stderr) helgrind/tests/tc06_two_races (stderr) helgrind/tests/tc07_hbl1 (stderr) helgrind/tests/tc08_hbl2 (stderr) helgrind/tests/tc09_bad_unlock (stderr) helgrind/tests/tc11_XCHG (stderr) helgrind/tests/tc12_rwl_trivial (stderr) helgrind/tests/tc14_laog_dinphils (stderr) helgrind/tests/tc16_byterace (stderr) helgrind/tests/tc17_sembar (stderr) helgrind/tests/tc18_semabuse (stderr) helgrind/tests/tc19_shadowmem (stderr) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc21_pthonce (stderr) helgrind/tests/tc22_exit_w_lock (stderr) helgrind/tests/tc23_bogus_condwait (stderr) helgrind/tests/tc24_nonzero_sem (stderr) |
|
From: Tom H. <th...@cy...> - 2008-03-29 04:26:41
|
Nightly build on lloyd ( x86_64, Fedora 7 ) started at 2008-03-29 03:05:05 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 413 tests, 6 stderr failures, 2 stdout failures, 0 post failures == memcheck/tests/pointer-trace (stderr) memcheck/tests/vcpu_fnfns (stdout) memcheck/tests/x86/scalar (stderr) none/tests/faultstatus (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc22_exit_w_lock (stderr) |
|
From: Tom H. <th...@cy...> - 2008-03-29 03:52:27
|
Nightly build on aston ( x86_64, Fedora Core 5 ) started at 2008-03-29 03:20:07 GMT Results differ from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 419 tests, 9 stderr failures, 1 stdout failure, 0 post failures == memcheck/tests/malloc_free_fill (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/x86/scalar (stderr) none/tests/blockfault (stderr) none/tests/faultstatus (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc21_pthonce (stderr) helgrind/tests/tc22_exit_w_lock (stderr) ================================================= == Results from 24 hours ago == ================================================= Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 419 tests, 8 stderr failures, 1 stdout failure, 0 post failures == memcheck/tests/malloc_free_fill (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/x86/scalar (stderr) none/tests/blockfault (stderr) none/tests/faultstatus (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc22_exit_w_lock (stderr) ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short Sat Mar 29 03:36:42 2008 --- new.short Sat Mar 29 03:52:31 2008 *************** *** 8,10 **** ! == 419 tests, 8 stderr failures, 1 stdout failure, 0 post failures == memcheck/tests/malloc_free_fill (stderr) --- 8,10 ---- ! == 419 tests, 9 stderr failures, 1 stdout failure, 0 post failures == memcheck/tests/malloc_free_fill (stderr) *************** *** 17,18 **** --- 17,19 ---- helgrind/tests/tc20_verifywrap (stderr) + helgrind/tests/tc21_pthonce (stderr) helgrind/tests/tc22_exit_w_lock (stderr) |
|
From: Tom H. <th...@cy...> - 2008-03-29 03:40:15
|
Nightly build on trojan ( x86_64, Fedora Core 6 ) started at 2008-03-29 03:25:07 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 417 tests, 8 stderr failures, 5 stdout failures, 0 post failures == memcheck/tests/pointer-trace (stderr) memcheck/tests/vcpu_fnfns (stdout) memcheck/tests/x86/bug133694 (stdout) memcheck/tests/x86/bug133694 (stderr) memcheck/tests/x86/scalar (stderr) none/tests/cmdline1 (stdout) none/tests/cmdline2 (stdout) none/tests/faultstatus (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc21_pthonce (stderr) helgrind/tests/tc22_exit_w_lock (stderr) |