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
(1) |
|
2
(28) |
3
(21) |
4
(27) |
5
(22) |
6
(24) |
7
(25) |
8
(21) |
|
9
(18) |
10
(20) |
11
(10) |
12
(36) |
13
(18) |
14
(18) |
15
(29) |
|
16
(17) |
17
(7) |
18
(11) |
19
(17) |
20
(18) |
21
(12) |
22
(13) |
|
23
(9) |
24
(8) |
25
(7) |
26
(22) |
27
(18) |
28
(9) |
29
(15) |
|
30
(13) |
31
(7) |
|
|
|
|
|
|
From: <sv...@va...> - 2005-10-15 22:07:40
|
Author: njn
Date: 2005-10-15 23:07:28 +0100 (Sat, 15 Oct 2005)
New Revision: 4936
Log:
Cachegrind cleanups:
- Remove some unnecessary assertions.
- Add in some new ones.
- Make things more concise and readable by factoring out things like
"cgs->events[i+1]" into things like "ev2" in flushEvents().
Modified:
trunk/cachegrind/cg_main.c
Modified: trunk/cachegrind/cg_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/cachegrind/cg_main.c 2005-10-15 17:54:35 UTC (rev 4935)
+++ trunk/cachegrind/cg_main.c 2005-10-15 22:07:28 UTC (rev 4936)
@@ -540,10 +540,7 @@
{
tl_assert(cgs->bbInfo_i >=3D 0);
tl_assert(cgs->bbInfo_i <=3D cgs->bbInfo->n_instrs);
- if (cgs->bbInfo_i =3D=3D 0)
- return NULL;
- else
- return &cgs->bbInfo->instrs[ cgs->bbInfo_i - 1 ];
+ return &cgs->bbInfo->instrs[ cgs->bbInfo_i - 1 ];
}
=20
=20
@@ -564,6 +561,9 @@
InstrInfo* i_node;
InstrInfo* i_node2;
InstrInfo* i_node3;
+ Event* ev;
+ Event* ev2;
+ Event* ev3;
=20
i =3D 0;
while (i < cgs->events_used) {
@@ -576,9 +576,14 @@
/* generate IR to notify event i and possibly the ones
immediately following it. */
tl_assert(i >=3D 0 && i < cgs->events_used);
+
+ ev =3D &cgs->events[i];
+ ev2 =3D ( i < cgs->events_used-1 ? &cgs->events[i+1] : NULL );
+ ev3 =3D ( i < cgs->events_used-2 ? &cgs->events[i+2] : NULL );
+ =20
if (DEBUG_CG) {
VG_(printf)(" flush ");=20
- showEvent( &cgs->events[i] );
+ showEvent( ev );
}
=20
/* For any event we find the relevant InstrInfo. The following
@@ -588,76 +593,66 @@
most recently encountered IMark and so we use the
most-recently allocated instrs[] entry, which must exist. */
=20
- if (cgs->events[i].ekind =3D=3D Event_Ir) {
+ if (ev->ekind =3D=3D Event_Ir) {
/* allocate an InstrInfo and fill in its addr/size. */
i_node =3D reserve_InstrInfo( cgs );
- tl_assert(i_node);
init_InstrInfo( i_node,
- (Addr)cgs->events[i].iaddr, /* i addr */
- cgs->events[i].size /* i size */);
+ (Addr)ev->iaddr, /* i addr */
+ ev->size /* i size */);
} else {
/* use the most-recently allocated i_node but don't mess with
its internals */
i_node =3D find_most_recent_InstrInfo( cgs );
- /* it must actually exist */
- tl_assert(i_node);
- /* it must match the declared parent instruction of this
- event. */
- tl_assert(i_node->instr_addr =3D=3D cgs->events[i].iaddr);
+ /* it must match the declared parent instruction of this event.=
*/
+ tl_assert(i_node->instr_addr =3D=3D ev->iaddr);
}
=20
i_node_expr =3D mkIRExpr_HWord( (HWord)i_node );
=20
/* Decide on helper fn to call and args to pass it, and advance
i appropriately. */
- switch (cgs->events[i].ekind) {
+ switch (ev->ekind) {
case Event_Ir:
/* Merge with a following Dr/Dm if it is from this insn. */
- if (i < cgs->events_used-1=20
- && cgs->events[i+1].iaddr =3D=3D cgs->events[i].iaddr
- && (cgs->events[i+1].ekind =3D=3D Event_Dr
- || cgs->events[i+1].ekind =3D=3D Event_Dm)) {
+ if (ev2 && (ev2->ekind =3D=3D Event_Dr || ev2->ekind =3D=3D =
Event_Dm)) {
+ tl_assert(ev2->iaddr =3D=3D ev->iaddr);
helperName =3D "log_1I_1Dr_cache_access";
helperAddr =3D &log_1I_1Dr_cache_access;
argv =3D mkIRExprVec_3( i_node_expr,
- cgs->events[i+1].dataEA,
- mkIRExpr_HWord( cgs->events[i+1].si=
ze ) );
+ ev2->dataEA,
+ mkIRExpr_HWord( ev2->size ) );
regparms =3D 3;
i +=3D 2;
}
/* Merge with a following Dw if it is from this insn. */
else
- if (i < cgs->events_used-1=20
- && cgs->events[i+1].iaddr =3D=3D cgs->events[i].iaddr
- && cgs->events[i+1].ekind =3D=3D Event_Dw) {
+ if (ev2 && ev2->ekind =3D=3D Event_Dw) {
+ tl_assert(ev2->iaddr =3D=3D ev->iaddr);
helperName =3D "log_1I_1Dw_cache_access";
helperAddr =3D &log_1I_1Dw_cache_access;
argv =3D mkIRExprVec_3( i_node_expr,
- cgs->events[i+1].dataEA,
- mkIRExpr_HWord( cgs->events[i+1].si=
ze ) );
+ ev2->dataEA,
+ mkIRExpr_HWord( ev2->size ) );
regparms =3D 3;
i +=3D 2;
}
/* Merge with two following Irs if possible. */
else
- if (i < cgs->events_used-2=20
- && cgs->events[i+1].ekind =3D=3D Event_Ir
- && cgs->events[i+2].ekind =3D=3D Event_Ir) {
+ if (ev2 && ev3 && ev2->ekind =3D=3D Event_Ir && ev3->ekind =3D=
=3D Event_Ir)
+ {
helperName =3D "log_3I_0D_cache_access";
helperAddr =3D &log_3I_0D_cache_access;
=20
i_node2 =3D reserve_InstrInfo( cgs );
- tl_assert(i_node2);
init_InstrInfo( i_node2,
- (Addr)cgs->events[i+1].iaddr, /* i addr *=
/
- cgs->events[i+1].size /* i size */);
+ (Addr)ev2->iaddr, /* i addr */
+ ev2->size /* i size */);
i_node2_expr =3D mkIRExpr_HWord( (HWord)i_node2 );
=20
i_node3 =3D reserve_InstrInfo( cgs );
- tl_assert(i_node3);
init_InstrInfo( i_node3,
- (Addr)cgs->events[i+2].iaddr, /* i addr *=
/
- cgs->events[i+2].size /* i size */);
+ (Addr)ev3->iaddr, /* i addr */
+ ev3->size /* i size */);
i_node3_expr =3D mkIRExpr_HWord( (HWord)i_node3 );
=20
argv =3D mkIRExprVec_3( i_node_expr, i_node2_expr, i_node=
3_expr );
@@ -666,15 +661,15 @@
}
/* Merge with a following Ir if possible. */
else
- if (i < cgs->events_used-1=20
- && cgs->events[i+1].ekind =3D=3D Event_Ir) {
+ if (ev2 && ev2->ekind =3D=3D Event_Ir) {
helperName =3D "log_2I_0D_cache_access";
helperAddr =3D &log_2I_0D_cache_access;
+
i_node2 =3D reserve_InstrInfo( cgs );
- tl_assert(i_node2);
init_InstrInfo( i_node2,
- (Addr)cgs->events[i+1].iaddr, /* i addr *=
/
- cgs->events[i+1].size /* i size */);
+ (Addr)ev2->iaddr, /* i addr */
+ ev2->size /* i size */);
+
i_node2_expr =3D mkIRExpr_HWord( (HWord)i_node2 );
argv =3D mkIRExprVec_2( i_node_expr, i_node2_expr );
regparms =3D 2;
@@ -682,6 +677,10 @@
}
/* No merging possible; emit as-is. */
else {
+ // Assertion: this Event_Ir must be the last one in the
+ // events buffer, otherwise it would have been merged wit=
h a
+ // following event.
+ tl_assert(!ev2 && !ev3);
helperName =3D "log_1I_0D_cache_access";
helperAddr =3D &log_1I_0D_cache_access;
argv =3D mkIRExprVec_1( i_node_expr );
@@ -694,8 +693,8 @@
helperName =3D "log_0I_1Dr_cache_access";
helperAddr =3D &log_0I_1Dr_cache_access;
argv =3D mkIRExprVec_3( i_node_expr,=20
- cgs->events[i].dataEA,=20
- mkIRExpr_HWord( cgs->events[i].size ) =
);
+ ev->dataEA,=20
+ mkIRExpr_HWord( ev->size ) );
regparms =3D 3;
i++;
break;
@@ -703,8 +702,8 @@
helperName =3D "log_0I_1Dw_cache_access";
helperAddr =3D &log_0I_1Dw_cache_access;
argv =3D mkIRExprVec_3( i_node_expr,
- cgs->events[i].dataEA,=20
- mkIRExpr_HWord( cgs->events[i].size ) =
);
+ ev->dataEA,=20
+ mkIRExpr_HWord( ev->size ) );
regparms =3D 3;
i++;
break;
|
|
From: Tom H. <to...@co...> - 2005-10-15 21:38:31
|
In message <200...@gm...>
Josef Weidendorfer <Jos...@gm...> wrote:
> Can you ensure that the launcher from say VG 3.2 will
> work flawlessly with callgrind linked with VG 3.1 ?
Well not absolutely, but it seems likely.
> If not, external tools still would need to have a
> version check at runtime as we have now.
I believe that is on the to do list.
> I can get rid of this problem if I provide my own launcher ("callgrind").
> BTW: Is a launcher like this enough:
>
> #!/bin/sh
> export VALGRIND_LAUNCHER=callgrind
> exec /usr/local/lib/valgrind/callgrind $*
In principle I suspect so, at least until you want biarch support.
> Or is there another issue that a binary package of an external tool
> would have to depend on a valgrind installation?
> What about vg_preload_core.so?
That would be an issue, yes. It's only used to trap __libc_freeres
at the momemt though.
Tom
--
Tom Hughes (to...@co...)
http://www.compton.nu/
|
|
From: Julian S. <js...@ac...> - 2005-10-15 19:24:00
|
> Basically it takes the argument to --tool and then just does an exec > of /usr/lib/valgrind/<tool> so if you install a statically linked callgrind > binary in the valgrind library directory it should all work. I agree. Except also it figures out the name of the launcher and sets VALGRIND_LAUNCHER to this value, so that when child process is exec'd and we want to trace it, the name of the launcher is known. > dunsmere [~] % /tmp/valgrind-debug/lib/valgrind/memcheck date > valgrind: You cannot run '/tmp/valgrind-debug/lib/valgrind/memcheck' > directly. valgrind: You should use $prefix/bin/valgrind. Yeh .. that just means really "VALGRIND_LAUNCHER is not set". Perhaps it would be better to reword the message. So as Josef says the following is probably OK: #!/bin/sh export VALGRIND_LAUNCHER=callgrind exec /usr/local/lib/valgrind/callgrind $* J |
|
From: Josef W. <Jos...@gm...> - 2005-10-15 18:21:04
|
On Saturday 15 October 2005 18:32, Tom Hughes wrote:
> All the launcher does is decided which tool to run and exec it - there
> should be no need for a tool writer to recreate the launcher as it will
> try and run unknown tools quite happily.
Yes.
But as I said, I saw it as a big plus for the static linking of tools to be
able to install them without needing any valgrind installation at all.
No need to worry about version mismatches.
Can you ensure that the launcher from say VG 3.2 will
work flawlessly with callgrind linked with VG 3.1 ?
If not, external tools still would need to have a
version check at runtime as we have now.
I can get rid of this problem if I provide my own launcher ("callgrind").
BTW: Is a launcher like this enough:
#!/bin/sh
export VALGRIND_LAUNCHER=callgrind
exec /usr/local/lib/valgrind/callgrind $*
Or is there another issue that a binary package of an external tool
would have to depend on a valgrind installation?
What about vg_preload_core.so?
> I don't know why you get a segmentation fault when you run a tool
> directly - that used to work, and was a useful way of debugging the
> tools but Julian disabled it when he added the stuff to pass through
> the launcher name for client execs.
Ah, ok. I thought there might be some "magic" here.
I just tried, and it works now:
~> VALGRIND_LAUNCHER= /usr/local/lib/valgrind/memcheck ls
==414== Memcheck, a memory error detector.
...
Josef
|
|
From: <sv...@va...> - 2005-10-15 17:58:07
|
Author: njn
Date: 2005-10-15 18:58:03 +0100 (Sat, 15 Oct 2005)
New Revision: 217
Log:
Move slides for the RV'03 paper from Press/Media to Publications.
Modified:
trunk/docs/pubs.html
trunk/gallery/press_media.html
Modified: trunk/docs/pubs.html
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=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/docs/pubs.html 2005-10-13 04:54:32 UTC (rev 216)
+++ trunk/docs/pubs.html 2005-10-15 17:58:03 UTC (rev 217)
@@ -29,7 +29,7 @@
</p></li>
=20
<li><p>
- <a href=3D"/docs/valgrind2003.ps.bz2">Valgrind: A Program Supervision F=
ramework.</a><br>
+ <a href=3D"/docs/valgrind2003.ps.bz2">Valgrind: A Program Supervision F=
ramework.</a> (<a href=3D"/gallery/valgrind2003-talk.ps.bz2">slides</a>)<=
br>
Nicholas Nethercote and Julian Seward.<br>
Electronic Notes in Theoretical Computer Science 89 No. 2, 2003.
</p></li>
Modified: trunk/gallery/press_media.html
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=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/gallery/press_media.html 2005-10-13 04:54:32 UTC (rev 216)
+++ trunk/gallery/press_media.html 2005-10-15 17:58:03 UTC (rev 217)
@@ -42,11 +42,6 @@
(<a href=3D"http://www.kurups.org/valgrind/valgrind.sxi">OpenOffice<=
/a>,=20
<a href=3D"http://www.kurups.org/valgrind/valgrind.ppt">PowerPoint<=
/a>).<br />
Madhu M Kurup. Linux Bangalore 2003.</li>
-
- <li><a href=3D"/gallery/valgrind2003-talk.ps.bz2">Valgrind:=20
- A Program Supervision Framework</a><br />
- Nicholas Nethercote. Runtime Verification workshop 2003.<br />
- A broad, formal, overview on how Valgrind is implemented.</li>
</ul>
=20
<h3>Announcements concerning Valgrind</h3>
|
|
From: <sv...@va...> - 2005-10-15 17:54:41
|
Author: njn Date: 2005-10-15 18:54:35 +0100 (Sat, 15 Oct 2005) New Revision: 4935 Log: update Modified: trunk/docs/internals/roadmap.txt Modified: trunk/docs/internals/roadmap.txt =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=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/docs/internals/roadmap.txt 2005-10-15 17:50:02 UTC (rev 4934) +++ trunk/docs/internals/roadmap.txt 2005-10-15 17:54:35 UTC (rev 4935) @@ -42,6 +42,10 @@ it is only present in GCC after 3.4.0 (ie. not in 3.0.X--3.3.X)... [Done by Tom and others] =20 +* We need to reintroduce some kind of core/tool interface versioning, + so that if external tools link with libcoregrind.a incompatibilities + are detected. + Maybe ----- * Get pthread modelling and Helgrind working again. Requires function |
|
From: <sv...@va...> - 2005-10-15 17:50:09
|
Author: njn Date: 2005-10-15 18:50:02 +0100 (Sat, 15 Oct 2005) New Revision: 4934 Log: Comment-only changes. Modified: trunk/include/pub_tool_oset.h Modified: trunk/include/pub_tool_oset.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_oset.h 2005-10-15 17:46:18 UTC (rev 4933) +++ trunk/include/pub_tool_oset.h 2005-10-15 17:50:02 UTC (rev 4934) @@ -75,7 +75,6 @@ =20 // * Create: allocates an initialises the OSet. Arguments: // - keyOff The offset of the key within the element. -// - elemSize The size of the element. // - cmp The comparison function between keys and elements, or N= ULL // if the OSet should use fast comparisons. // - alloc The allocation function used for allocating the OSet it= self; @@ -110,6 +109,10 @@ /*--- Operations on OSets ---*/ /*--------------------------------------------------------------------*/ =20 +// In everything that follows, the parameter 'key' is always the *addres= s* +// of the key, and 'elem' is *address* of the elem, as are the return va= lues +// of the functions that return elems. +// // * Size: The number of elements in the set. // // * Contains: Determines if any element in the OSet matches the key. |
|
From: <sv...@va...> - 2005-10-15 17:46:23
|
Author: njn
Date: 2005-10-15 18:46:18 +0100 (Sat, 15 Oct 2005)
New Revision: 4933
Log:
OSet-ified Cachegrind: =20
- The instrInfoTable was a VgHashTable, now it's an OSet. =20
- The CC table was a custom 3-level hash table, now it's an OSet. This
is easier to understand and there's no worrying about whether the hash
array sizes are big enough. It also has the nice property that the
results in the cachegrind.out.<pid> file are now sorted, so they're a b=
it
easier to read.
I did some testing and the performance difference appears to be negligibl=
e;
CC table and InstrInfo table lookups and traversal aren't that critical.
=20
Modified:
trunk/cachegrind/cg_main.c
Modified: trunk/cachegrind/cg_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/cachegrind/cg_main.c 2005-10-15 17:18:08 UTC (rev 4932)
+++ trunk/cachegrind/cg_main.c 2005-10-15 17:46:18 UTC (rev 4933)
@@ -31,7 +31,6 @@
=20
#include "pub_tool_basics.h"
#include "pub_tool_debuginfo.h"
-#include "pub_tool_hashtable.h"
#include "pub_tool_libcbase.h"
#include "pub_tool_libcassert.h"
#include "pub_tool_libcfile.h"
@@ -40,6 +39,7 @@
#include "pub_tool_machine.h"
#include "pub_tool_mallocfree.h"
#include "pub_tool_options.h"
+#include "pub_tool_oset.h"
#include "pub_tool_profile.h"
#include "pub_tool_tooliface.h"
#include "pub_tool_clientstate.h"
@@ -55,7 +55,7 @@
#define DEBUG_CG 0
=20
#define MIN_LINE_SIZE 16
-#define FILE_LEN 256
+#define FILE_LEN VKI_PATH_MAX
#define FN_LEN 256
=20
/*------------------------------------------------------------*/
@@ -84,84 +84,119 @@
//------------------------------------------------------------
// Primary data structure #1: CC table
// - Holds the per-source-line hit/miss stats, grouped by file/function/=
line.
-// - hash(file, hash(fn, hash(line+CC)))
-// - Each hash table is separately chained.
-// - The array sizes below work fairly well for Konqueror.
-// - Lookups done by instr_addr, which is converted immediately to a sou=
rce
-// location.
+// - an ordered set of CCs. CC indexing done by file/function/line (as
+// determined from the instrAddr).
// - Traversed for dumping stats at end in file/func/line hierarchy.
=20
-#define N_FILE_ENTRIES 251
-#define N_FN_ENTRIES 53
-#define N_LINE_ENTRIES 37
+typedef struct {
+ Char* file;
+ Char* fn;
+ Int line;
+}
+CodeLoc;
=20
-typedef struct _lineCC lineCC;
-struct _lineCC {
- Int line;
- CC Ir;
- CC Dr;
- CC Dw;
- lineCC* next;
+typedef struct _LineCC LineCC;
+struct _LineCC {
+ CodeLoc loc;
+ CC Ir;
+ CC Dr;
+ CC Dw;
};
=20
-typedef struct _fnCC fnCC;
-struct _fnCC {
- Char* fn;
- fnCC* next;
- lineCC* lines[N_LINE_ENTRIES];
-};
+// First compare file, then fn, then line.
+static Int cmp_CodeLoc_LineCC(void *vloc, void *vcc)
+{
+ Int res;
+ CodeLoc* a =3D (CodeLoc*)vloc;
+ CodeLoc* b =3D &(((LineCC*)vcc)->loc);
=20
-typedef struct _fileCC fileCC;
-struct _fileCC {
- Char* file;
- fileCC* next;
- fnCC* fns[N_FN_ENTRIES];
-};
+ res =3D VG_(strcmp)(a->file, b->file);
+ if (0 !=3D res)
+ return res;
=20
-// Top level of CC table. Auto-zeroed.
-static fileCC *CC_table[N_FILE_ENTRIES];
+ res =3D VG_(strcmp)(a->fn, b->fn);
+ if (0 !=3D res)
+ return res;
=20
+ return a->line - b->line;
+}
+
+static OSet* CC_table;
+
//------------------------------------------------------------
-// Primary data structure #2: Instr-info table
+// Primary data structure #2: InstrInfo table
// - Holds the cached info about each instr that is used for simulation.
-// - table(BB_start_addr, list(instr_info))
-// - For each BB, each instr_info in the list holds info about the
-// instruction (instr_len, instr_addr, etc), plus a pointer to its lin=
e
+// - table(BB_start_addr, list(InstrInfo))
+// - For each BB, each InstrInfo in the list holds info about the
+// instruction (instrLen, instrAddr, etc), plus a pointer to its line
// CC. This node is what's passed to the simulation function.
// - When BBs are discarded the relevant list(instr_details) is freed.
=20
-typedef struct _instr_info instr_info;
-struct _instr_info {
+typedef struct _InstrInfo InstrInfo;
+struct _InstrInfo {
Addr instr_addr;
UChar instr_len;
- lineCC* parent; // parent line-CC
+ LineCC* parent; // parent line-CC
};
=20
typedef struct _BB_info BB_info;
struct _BB_info {
- BB_info* next; // next field
- Addr BB_addr; // key
- Int n_instrs;
- instr_info instrs[0];
+ Addr BB_addr; // key
+ Int n_instrs;
+ InstrInfo instrs[0];
};
=20
-VgHashTable instr_info_table; // hash(Addr, BB_info)
+static OSet* instrInfoTable;
=20
//------------------------------------------------------------
+// Secondary data structure: string table
+// - holds strings, avoiding dups
+// - used for filenames and function names, each of which will be
+// pointed to by one or more CCs.
+// - it also allows equality checks just by pointer comparison, which
+// is good when printing the output file at the end.
+
+static OSet* stringTable;
+
+//------------------------------------------------------------
// Stats
static Int distinct_files =3D 0;
static Int distinct_fns =3D 0;
static Int distinct_lines =3D 0;
static Int distinct_instrs =3D 0;
=20
-static Int full_debug_BBs =3D 0;
-static Int file_line_debug_BBs =3D 0;
-static Int fn_debug_BBs =3D 0;
-static Int no_debug_BBs =3D 0;
+static Int full_debugs =3D 0;
+static Int file_line_debugs =3D 0;
+static Int fn_debugs =3D 0;
+static Int no_debugs =3D 0;
=20
static Int BB_retranslations =3D 0;
=20
/*------------------------------------------------------------*/
+/*--- String table operations ---*/
+/*------------------------------------------------------------*/
+
+static Int stringCmp( void* key, void* elem )
+{
+ return VG_(strcmp)(*(Char**)key, *(Char**)elem);
+}
+
+// Get a permanent string; either pull it out of the string table if it=
's
+// been encountered before, or dup it and put it into the string table.
+static Char* get_perm_string(Char* s)
+{
+ Char** s_ptr =3D VG_(OSet_Lookup)(stringTable, &s);
+ if (s_ptr) {
+ return *s_ptr;
+ } else {
+ Char** s_node =3D VG_(OSet_AllocNode)(stringTable, sizeof(Char*));
+ *s_node =3D VG_(strdup)(s);
+ VG_(OSet_Insert)(stringTable, s_node);
+ return *s_node;
+ }
+}
+
+/*------------------------------------------------------------*/
/*--- CC table operations ---*/
/*------------------------------------------------------------*/
=20
@@ -184,107 +219,43 @@
VG_(strcpy)(fn, "???");
}
if (found_file_line) {
- if (found_fn) full_debug_BBs++;
- else file_line_debug_BBs++;
+ if (found_fn) full_debugs++;
+ else file_line_debugs++;
} else {
- if (found_fn) fn_debug_BBs++;
- else no_debug_BBs++;
+ if (found_fn) fn_debugs++;
+ else no_debugs++;
}
}
=20
-static UInt hash(Char *s, UInt table_size)
-{
- const Int hash_constant =3D 256;
- Int hash_value =3D 0;
- for ( ; *s; s++)
- hash_value =3D (hash_constant * hash_value + *s) % table_size;
- return hash_value;
-}
-
-static __inline__=20
-fileCC* new_fileCC(Char filename[], fileCC* next)
-{
- // Using calloc() zeroes the fns[] array
- fileCC* cc =3D VG_(calloc)(1, sizeof(fileCC));
- cc->file =3D VG_(strdup)(filename);
- cc->next =3D next;
- return cc;
-}
-
-static __inline__=20
-fnCC* new_fnCC(Char fn[], fnCC* next)
-{
- // Using calloc() zeroes the lines[] array
- fnCC* cc =3D VG_(calloc)(1, sizeof(fnCC));
- cc->fn =3D VG_(strdup)(fn);
- cc->next =3D next;
- return cc;
-}
-
-static __inline__=20
-lineCC* new_lineCC(Int line, lineCC* next)
-{
- // Using calloc() zeroes the Ir/Dr/Dw CCs and the instrs[] array
- lineCC* cc =3D VG_(calloc)(1, sizeof(lineCC));
- cc->line =3D line;
- cc->next =3D next;
- return cc;
-}
-
// Do a three step traversal: by file, then fn, then line.
-// In all cases prepends new nodes to their chain. Returns a pointer to=
the
-// line node, creates a new one if necessary.
-static lineCC* get_lineCC(Addr origAddr)
+// Returns a pointer to the line CC, creates a new one if necessary.
+static LineCC* get_lineCC(Addr origAddr)
{
- fileCC *curr_fileCC;
- fnCC *curr_fnCC;
- lineCC *curr_lineCC;
Char file[FILE_LEN], fn[FN_LEN];
Int line;
- UInt file_hash, fn_hash, line_hash;
+ CodeLoc loc;
+ LineCC* lineCC;
=20
get_debug_info(origAddr, file, fn, &line);
=20
VGP_PUSHCC(VgpGetLineCC);
=20
- // level 1
- file_hash =3D hash(file, N_FILE_ENTRIES);
- curr_fileCC =3D CC_table[file_hash];
- while (NULL !=3D curr_fileCC && !VG_STREQ(file, curr_fileCC->file)) {
- curr_fileCC =3D curr_fileCC->next;
- }
- if (NULL =3D=3D curr_fileCC) {
- CC_table[file_hash] =3D curr_fileCC =3D=20
- new_fileCC(file, CC_table[file_hash]);
- distinct_files++;
- }
+ loc.file =3D file;
+ loc.fn =3D fn;
+ loc.line =3D line;
=20
- // level 2
- fn_hash =3D hash(fn, N_FN_ENTRIES);
- curr_fnCC =3D curr_fileCC->fns[fn_hash];
- while (NULL !=3D curr_fnCC && !VG_STREQ(fn, curr_fnCC->fn)) {
- curr_fnCC =3D curr_fnCC->next;
+ lineCC =3D VG_(OSet_Lookup)(CC_table, &loc);
+ if (!lineCC) {
+ // Allocate and zero a new node.
+ lineCC =3D VG_(OSet_AllocNode)(CC_table, sizeof(LineCC))=
;
+ lineCC->loc.file =3D get_perm_string(loc.file);
+ lineCC->loc.fn =3D get_perm_string(loc.fn);
+ lineCC->loc.line =3D loc.line;
+ VG_(OSet_Insert)(CC_table, lineCC);
}
- if (NULL =3D=3D curr_fnCC) {
- curr_fileCC->fns[fn_hash] =3D curr_fnCC =3D=20
- new_fnCC(fn, curr_fileCC->fns[fn_hash]);
- distinct_fns++;
- }
=20
- // level 3
- line_hash =3D line % N_LINE_ENTRIES;
- curr_lineCC =3D curr_fnCC->lines[line_hash];
- while (NULL !=3D curr_lineCC && line !=3D curr_lineCC->line) {
- curr_lineCC =3D curr_lineCC->next;
- }
- if (NULL =3D=3D curr_lineCC) {
- curr_fnCC->lines[line_hash] =3D curr_lineCC =3D=20
- new_lineCC(line, curr_fnCC->lines[line_hash]);
- distinct_lines++;
- }
-
VGP_POPCC(VgpGetLineCC);
- return curr_lineCC;
+ return lineCC;
}
=20
/*------------------------------------------------------------*/
@@ -292,7 +263,7 @@
/*------------------------------------------------------------*/
=20
static VG_REGPARM(1)
-void log_1I_0D_cache_access(instr_info* n)
+void log_1I_0D_cache_access(InstrInfo* n)
{
//VG_(printf)("1I_0D : CCaddr=3D0x%010lx, iaddr=3D0x%010lx, isize=3D=
%lu\n",
// n, n->instr_addr, n->instr_len);
@@ -304,7 +275,7 @@
}
=20
static VG_REGPARM(2)
-void log_2I_0D_cache_access(instr_info* n, instr_info* n2)
+void log_2I_0D_cache_access(InstrInfo* n, InstrInfo* n2)
{
//VG_(printf)("2I_0D : CC1addr=3D0x%010lx, i1addr=3D0x%010lx, i1size=3D=
%lu\n"
// " CC2addr=3D0x%010lx, i2addr=3D0x%010lx, i2size=3D=
%lu\n",
@@ -321,7 +292,7 @@
}
=20
static VG_REGPARM(3)
-void log_3I_0D_cache_access(instr_info* n, instr_info* n2, instr_info* n=
3)
+void log_3I_0D_cache_access(InstrInfo* n, InstrInfo* n2, InstrInfo* n3)
{
//VG_(printf)("3I_0D : CC1addr=3D0x%010lx, i1addr=3D0x%010lx, i1size=3D=
%lu\n"
// " CC2addr=3D0x%010lx, i2addr=3D0x%010lx, i2size=3D=
%lu\n"
@@ -343,7 +314,7 @@
}
=20
static VG_REGPARM(3)
-void log_1I_1Dr_cache_access(instr_info* n, Addr data_addr, Word data_si=
ze)
+void log_1I_1Dr_cache_access(InstrInfo* n, Addr data_addr, Word data_siz=
e)
{
//VG_(printf)("1I_1Dr: CCaddr=3D0x%010lx, iaddr=3D0x%010lx, isize=3D=
%lu\n"
// " daddr=3D0x%010lx, dsiz=
e=3D%lu\n",
@@ -360,7 +331,7 @@
}
=20
static VG_REGPARM(3)
-void log_1I_1Dw_cache_access(instr_info* n, Addr data_addr, Word data_si=
ze)
+void log_1I_1Dw_cache_access(InstrInfo* n, Addr data_addr, Word data_siz=
e)
{
//VG_(printf)("1I_1Dw: CCaddr=3D0x%010lx, iaddr=3D0x%010lx, isize=3D=
%lu\n"
// " daddr=3D0x%010lx, dsiz=
e=3D%lu\n",
@@ -377,7 +348,7 @@
}
=20
static VG_REGPARM(3)
-void log_0I_1Dr_cache_access(instr_info* n, Addr data_addr, Word data_si=
ze)
+void log_0I_1Dr_cache_access(InstrInfo* n, Addr data_addr, Word data_siz=
e)
{
//VG_(printf)("0I_1Dr: CCaddr=3D0x%010lx, daddr=3D0x%010lx, dsize=3D=
%lu\n",
// n, data_addr, data_size);
@@ -389,7 +360,7 @@
}
=20
static VG_REGPARM(3)
-void log_0I_1Dw_cache_access(instr_info* n, Addr data_addr, Word data_si=
ze)
+void log_0I_1Dw_cache_access(InstrInfo* n, Addr data_addr, Word data_siz=
e)
{
//VG_(printf)("0I_1Dw: CCaddr=3D0x%010lx, daddr=3D0x%010lx, dsize=3D=
%lu\n",
// n, data_addr, data_size);
@@ -465,10 +436,10 @@
Event events[N_EVENTS];
Int events_used;
=20
- /* The array of instr_info bins for the BB. */
+ /* The array of InstrInfo bins for the BB. */
BB_info* bbInfo;
=20
- /* Number instr_info bins 'used' so far. */
+ /* Number InstrInfo bins 'used' so far. */
Int bbInfo_i;
=20
/* The output BB being constructed. */
@@ -487,7 +458,7 @@
Int i, n_instrs;
IRStmt* st;
BB_info* bbInfo;
- =20
+
// Count number of original instrs in BB
n_instrs =3D 0;
for (i =3D 0; i < bbIn->stmts_used; i++) {
@@ -499,15 +470,16 @@
// If this assertion fails, there has been some screwup: some
// translations must have been discarded but Cachegrind hasn't discar=
ded
// the corresponding entries in the instr-info table.
- bbInfo =3D (BB_info*)VG_(HT_lookup)(instr_info_table, origAddr);
+ bbInfo =3D VG_(OSet_Lookup)(instrInfoTable, &origAddr);
tl_assert(NULL =3D=3D bbInfo);
=20
- // BB has never translated before (at this address, at least; could
- // have been unloaded and then reloaded elsewhere in memory).
- bbInfo =3D VG_(calloc)(1, sizeof(BB_info) + n_instrs*sizeof(instr_inf=
o));=20
- bbInfo->BB_addr =3D origAddr;
+ // BB never translated before (at this address, at least; could have
+ // been unloaded and then reloaded elsewhere in memory)
+ bbInfo =3D VG_(OSet_AllocNode)(instrInfoTable,
+ sizeof(BB_info) + n_instrs*sizeof(InstrI=
nfo));=20
+ bbInfo->BB_addr =3D origAddr;
bbInfo->n_instrs =3D n_instrs;
- VG_(HT_add_node)( instr_info_table, (VgHashNode*)bbInfo );
+ VG_(OSet_Insert)( instrInfoTable, bbInfo );
distinct_instrs++;
=20
return bbInfo;
@@ -515,7 +487,7 @@
=20
=20
static
-void init_instr_info( instr_info* n, Addr instr_addr, Int instr_len )
+void init_InstrInfo( InstrInfo* n, Addr instr_addr, Int instr_len )
{
n->instr_addr =3D instr_addr;
n->instr_len =3D instr_len;
@@ -549,11 +521,11 @@
}
}
=20
-/* Reserve instr_info for the first mention of a new insn. */
+/* Reserve InstrInfo for the first mention of a new insn. */
=20
-static instr_info* reserve_instr_info ( CgState* cgs )
+static InstrInfo* reserve_InstrInfo ( CgState* cgs )
{
- instr_info* i_node;
+ InstrInfo* i_node;
tl_assert(cgs->bbInfo_i >=3D 0);
tl_assert(cgs->bbInfo_i < cgs->bbInfo->n_instrs);
i_node =3D &cgs->bbInfo->instrs[ cgs->bbInfo_i ];
@@ -562,9 +534,9 @@
}
=20
=20
-/* Find the most recently allocated instr_info. */
+/* Find the most recently allocated InstrInfo. */
=20
-static instr_info* find_most_recent_instr_info ( CgState* cgs )
+static InstrInfo* find_most_recent_InstrInfo ( CgState* cgs )
{
tl_assert(cgs->bbInfo_i >=3D 0);
tl_assert(cgs->bbInfo_i <=3D cgs->bbInfo->n_instrs);
@@ -581,17 +553,17 @@
=20
static void flushEvents ( CgState* cgs )
{
- Int i, regparms;
- Char* helperName;
- void* helperAddr;
- IRExpr** argv;
- IRExpr* i_node_expr;
- IRExpr* i_node2_expr;
- IRExpr* i_node3_expr;
- IRDirty* di;
- instr_info* i_node;
- instr_info* i_node2;
- instr_info* i_node3;
+ Int i, regparms;
+ Char* helperName;
+ void* helperAddr;
+ IRExpr** argv;
+ IRExpr* i_node_expr;
+ IRExpr* i_node2_expr;
+ IRExpr* i_node3_expr;
+ IRDirty* di;
+ InstrInfo* i_node;
+ InstrInfo* i_node2;
+ InstrInfo* i_node3;
=20
i =3D 0;
while (i < cgs->events_used) {
@@ -609,7 +581,7 @@
showEvent( &cgs->events[i] );
}
=20
- /* For any event we find the relevant instr_info. The following
+ /* For any event we find the relevant InstrInfo. The following
assumes that Event_Ir is the first event to refer to any
specific insn, and so a new entry in the cgs->bbInfo->instrs
is allocated. All other events (Dr,Dw,Dm) must refer to the
@@ -617,16 +589,16 @@
most-recently allocated instrs[] entry, which must exist. */
=20
if (cgs->events[i].ekind =3D=3D Event_Ir) {
- /* allocate an instr_info and fill in its addr/size. */
- i_node =3D reserve_instr_info( cgs );
+ /* allocate an InstrInfo and fill in its addr/size. */
+ i_node =3D reserve_InstrInfo( cgs );
tl_assert(i_node);
- init_instr_info( i_node,
- (Addr)cgs->events[i].iaddr, /* i addr */
- cgs->events[i].size /* i size */);
+ init_InstrInfo( i_node,
+ (Addr)cgs->events[i].iaddr, /* i addr */
+ cgs->events[i].size /* i size */);
} else {
/* use the most-recently allocated i_node but don't mess with
its internals */
- i_node =3D find_most_recent_instr_info( cgs );
+ i_node =3D find_most_recent_InstrInfo( cgs );
/* it must actually exist */
tl_assert(i_node);
/* it must match the declared parent instruction of this
@@ -674,18 +646,18 @@
helperName =3D "log_3I_0D_cache_access";
helperAddr =3D &log_3I_0D_cache_access;
=20
- i_node2 =3D reserve_instr_info( cgs );
+ i_node2 =3D reserve_InstrInfo( cgs );
tl_assert(i_node2);
- init_instr_info( i_node2,
- (Addr)cgs->events[i+1].iaddr, /* i addr =
*/
- cgs->events[i+1].size /* i size */);
+ init_InstrInfo( i_node2,
+ (Addr)cgs->events[i+1].iaddr, /* i addr *=
/
+ cgs->events[i+1].size /* i size */);
i_node2_expr =3D mkIRExpr_HWord( (HWord)i_node2 );
=20
- i_node3 =3D reserve_instr_info( cgs );
+ i_node3 =3D reserve_InstrInfo( cgs );
tl_assert(i_node3);
- init_instr_info( i_node3,
- (Addr)cgs->events[i+2].iaddr, /* i addr =
*/
- cgs->events[i+2].size /* i size */);
+ init_InstrInfo( i_node3,
+ (Addr)cgs->events[i+2].iaddr, /* i addr *=
/
+ cgs->events[i+2].size /* i size */);
i_node3_expr =3D mkIRExpr_HWord( (HWord)i_node3 );
=20
argv =3D mkIRExprVec_3( i_node_expr, i_node2_expr, i_node=
3_expr );
@@ -698,11 +670,11 @@
&& cgs->events[i+1].ekind =3D=3D Event_Ir) {
helperName =3D "log_2I_0D_cache_access";
helperAddr =3D &log_2I_0D_cache_access;
- i_node2 =3D reserve_instr_info( cgs );
+ i_node2 =3D reserve_InstrInfo( cgs );
tl_assert(i_node2);
- init_instr_info( i_node2,
- (Addr)cgs->events[i+1].iaddr, /* i addr =
*/
- cgs->events[i+1].size /* i size */);
+ init_InstrInfo( i_node2,
+ (Addr)cgs->events[i+1].iaddr, /* i addr *=
/
+ cgs->events[i+1].size /* i size */);
i_node2_expr =3D mkIRExpr_HWord( (HWord)i_node2 );
argv =3D mkIRExprVec_2( i_node_expr, i_node2_expr );
regparms =3D 2;
@@ -1074,30 +1046,12 @@
=20
static Char* cachegrind_out_file;
=20
-static void fprint_lineCC(Int fd, lineCC* n)
-{
- Char buf[512];
- VG_(sprintf)(buf, "%u %llu %llu %llu %llu %llu %llu %llu %llu %llu\n"=
,
- n->line,
- n->Ir.a, n->Ir.m1, n->Ir.m2,=20
- n->Dr.a, n->Dr.m1, n->Dr.m2,
- n->Dw.a, n->Dw.m1, n->Dw.m2);
- VG_(write)(fd, (void*)buf, VG_(strlen)(buf));
-
- Ir_total.a +=3D n->Ir.a; Ir_total.m1 +=3D n->Ir.m1; Ir_total.m2 +=3D=
n->Ir.m2;
- Dr_total.a +=3D n->Dr.a; Dr_total.m1 +=3D n->Dr.m1; Dr_total.m2 +=3D=
n->Dr.m2;
- Dw_total.a +=3D n->Dw.a; Dw_total.m1 +=3D n->Dw.m1; Dw_total.m2 +=3D=
n->Dw.m2;
-}
-
static void fprint_CC_table_and_calc_totals(void)
{
- Int fd;
+ Int i, fd;
SysRes sres;
- Char buf[512];
- fileCC *curr_fileCC;
- fnCC *curr_fnCC;
- lineCC *curr_lineCC;
- Int i, j, k;
+ Char buf[512], *currFile =3D NULL, *currFn =3D NULL;
+ LineCC* lineCC;
=20
VGP_PUSHCC(VgpCacheResults);
=20
@@ -1143,32 +1097,48 @@
VG_(sprintf)(buf, "\nevents: Ir I1mr I2mr Dr D1mr D2mr Dw D1mw D2mw\n=
");
VG_(write)(fd, (void*)buf, VG_(strlen)(buf));
=20
- // Six loops here: three for the hash table arrays, and three for th=
e
- // chains hanging off the hash table arrays.
- for (i =3D 0; i < N_FILE_ENTRIES; i++) {
- curr_fileCC =3D CC_table[i];
- while (curr_fileCC !=3D NULL) {
- VG_(sprintf)(buf, "fl=3D%s\n", curr_fileCC->file);
+ // Traverse every lineCC
+ VG_(OSet_ResetIter)(CC_table);
+ while ( (lineCC =3D VG_(OSet_Next)(CC_table)) ) {
+ // If we've hit a new file, print a "fl=3D" line. Note that becau=
se
+ // each string is stored exactly once in the string table, we can =
use
+ // pointer comparison rather than strcmp() to test for equality, w=
hich
+ // is good because most of the time the comparisons are equal and =
so
+ // the whole strings would have to be traversed.
+ if ( lineCC->loc.file !=3D currFile ) {
+ currFile =3D lineCC->loc.file;
+ VG_(sprintf)(buf, "fl=3D%s\n", currFile);
VG_(write)(fd, (void*)buf, VG_(strlen)(buf));
+ distinct_files++;
+ }
+ // If we've hit a new function, print a "fn=3D" line.
+ if ( lineCC->loc.fn !=3D currFn ) {
+ currFn =3D lineCC->loc.fn;
+ VG_(sprintf)(buf, "fn=3D%s\n", currFn);
+ VG_(write)(fd, (void*)buf, VG_(strlen)(buf));
+ distinct_fns++;
+ }
=20
- for (j =3D 0; j < N_FN_ENTRIES; j++) {
- curr_fnCC =3D curr_fileCC->fns[j];
- while (curr_fnCC !=3D NULL) {
- VG_(sprintf)(buf, "fn=3D%s\n", curr_fnCC->fn);
- VG_(write)(fd, (void*)buf, VG_(strlen)(buf));
+ // Print the LineCC
+ VG_(sprintf)(buf, "%u %llu %llu %llu %llu %llu %llu %llu %llu %llu=
\n",
+ lineCC->loc.line,
+ lineCC->Ir.a, lineCC->Ir.m1, lineCC->Ir.m2,=20
+ lineCC->Dr.a, lineCC->Dr.m1, lineCC->Dr.m2,
+ lineCC->Dw.a, lineCC->Dw.m1, lineCC->Dw.m2);
+ VG_(write)(fd, (void*)buf, VG_(strlen)(buf));
=20
- for (k =3D 0; k < N_LINE_ENTRIES; k++) {
- curr_lineCC =3D curr_fnCC->lines[k];
- while (curr_lineCC !=3D NULL) {
- fprint_lineCC(fd, curr_lineCC);
- curr_lineCC =3D curr_lineCC->next;
- }
- }
- curr_fnCC =3D curr_fnCC->next;
- }
- }
- curr_fileCC =3D curr_fileCC->next;
- }
+ // Update summary stats
+ Ir_total.a +=3D lineCC->Ir.a;
+ Ir_total.m1 +=3D lineCC->Ir.m1;
+ Ir_total.m2 +=3D lineCC->Ir.m2;
+ Dr_total.a +=3D lineCC->Dr.a;
+ Dr_total.m1 +=3D lineCC->Dr.m1;
+ Dr_total.m2 +=3D lineCC->Dr.m2;
+ Dw_total.a +=3D lineCC->Dw.a;
+ Dw_total.m1 +=3D lineCC->Dw.m1;
+ Dw_total.m2 +=3D lineCC->Dw.m2;
+
+ distinct_lines++;
}
=20
// Summary stats must come after rest of table, since we calculate th=
em
@@ -1215,7 +1185,7 @@
=20
/* Make format string, getting width right for numbers */
VG_(sprintf)(fmt, "%%s %%,%dllu", l1);
- =20
+
VG_(message)(Vg_UserMsg, fmt, "I refs: ", Ir_total.a);
VG_(message)(Vg_UserMsg, fmt, "I1 misses: ", Ir_total.m1);
VG_(message)(Vg_UserMsg, fmt, "L2i misses: ", Ir_total.m2);
@@ -1225,7 +1195,7 @@
if (0 =3D=3D Ir_total.a) Ir_total.a =3D 1;
VG_(percentify)(Ir_total.m1, Ir_total.a, 2, l1+1, buf1);
VG_(message)(Vg_UserMsg, "I1 miss rate: %s", buf1);
- =20
+
VG_(percentify)(Ir_total.m2, Ir_total.a, 2, l1+1, buf1);
VG_(message)(Vg_UserMsg, "L2i miss rate: %s", buf1);
VG_(message)(Vg_UserMsg, "");
@@ -1235,7 +1205,7 @@
D_total.a =3D Dr_total.a + Dw_total.a;
D_total.m1 =3D Dr_total.m1 + Dw_total.m1;
D_total.m2 =3D Dr_total.m2 + Dw_total.m2;
- =20
+
/* Make format string, getting width right for numbers */
VG_(sprintf)(fmt, "%%s %%,%dllu (%%,%dllu rd + %%,%dllu wr)", l1, l2=
, l3);
=20
@@ -1247,7 +1217,7 @@
D_total.m2, Dr_total.m2, Dw_total.m2);
=20
p =3D 10;
- =20
+
if (0 =3D=3D D_total.a) D_total.a =3D 1;
if (0 =3D=3D Dr_total.a) Dr_total.a =3D 1;
if (0 =3D=3D Dw_total.a) Dw_total.a =3D 1;
@@ -1280,32 +1250,35 @@
VG_(percentify)(L2_total_mr, (Ir_total.a + Dr_total.a), 1, l2+1, buf2=
);
VG_(percentify)(L2_total_mw, Dw_total.a, 1, l3+1, buf3=
);
VG_(message)(Vg_UserMsg, "L2 miss rate: %s (%s + %s )", buf1, buf=
2,buf3);
- =20
=20
+
// Various stats
if (VG_(clo_verbosity) > 1) {
- Int BB_lookups =3D full_debug_BBs + fn_debug_BBs +
- file_line_debug_BBs + no_debug_BBs;
- =20
+ Int debug_lookups =3D full_debugs + fn_debugs +
+ file_line_debugs + no_debugs;
+
VG_(message)(Vg_DebugMsg, "");
- VG_(message)(Vg_DebugMsg, "Distinct files: %d", distinct_files)=
;
- VG_(message)(Vg_DebugMsg, "Distinct fns: %d", distinct_fns);
- VG_(message)(Vg_DebugMsg, "Distinct lines: %d", distinct_lines)=
;
- VG_(message)(Vg_DebugMsg, "Distinct instrs: %d", distinct_instrs=
);
- VG_(message)(Vg_DebugMsg, "BB lookups: %d", BB_lookups);
- VG_(message)(Vg_DebugMsg, "With full debug info:%3d%% (%d)",=
=20
- full_debug_BBs * 100 / BB_lookups,
- full_debug_BBs);
- VG_(message)(Vg_DebugMsg, "With file/line debug info:%3d%% (%d)",=
=20
- file_line_debug_BBs * 100 / BB_lookups,
- file_line_debug_BBs);
- VG_(message)(Vg_DebugMsg, "With fn name debug info:%3d%% (%d)",=
=20
- fn_debug_BBs * 100 / BB_lookups,
- fn_debug_BBs);
- VG_(message)(Vg_DebugMsg, "With no debug info:%3d%% (%d)",=
=20
- no_debug_BBs * 100 / BB_lookups,
- no_debug_BBs);
- VG_(message)(Vg_DebugMsg, "BBs Retranslated: %d", BB_retranslatio=
ns);
+ VG_(message)(Vg_DebugMsg, "cachegrind: distinct files: %d", disti=
nct_files);
+ VG_(message)(Vg_DebugMsg, "cachegrind: distinct fns: %d", disti=
nct_fns);
+ VG_(message)(Vg_DebugMsg, "cachegrind: distinct lines: %d", disti=
nct_lines);
+ VG_(message)(Vg_DebugMsg, "cachegrind: distinct instrs:%d", disti=
nct_instrs);
+ VG_(message)(Vg_DebugMsg, "cachegrind: debug lookups : %d", =
debug_lookups);
+ VG_(message)(Vg_DebugMsg, "cachegrind: with full info:%3d%% =
(%d)",=20
+ full_debugs * 100 / debug_lookups, full_debugs);
+ VG_(message)(Vg_DebugMsg, "cachegrind: with file/line info:%3d%% =
(%d)",=20
+ file_line_debugs * 100 / debug_lookups, file_line_de=
bugs);
+ VG_(message)(Vg_DebugMsg, "cachegrind: with fn name info:%3d%% =
(%d)",=20
+ fn_debugs * 100 / debug_lookups, fn_debugs);
+ VG_(message)(Vg_DebugMsg, "cachegrind: with zero info:%3d%% =
(%d)",=20
+ no_debugs * 100 / debug_lookups, no_debugs);
+ VG_(message)(Vg_DebugMsg, "cachegrind: BBs Retranslated: %d",
+ BB_retranslations);
+ VG_(message)(Vg_DebugMsg, "cachegrind: string table size: %u",
+ VG_(OSet_Size)(stringTable));
+ VG_(message)(Vg_DebugMsg, "cachegrind: CC table size: %u",
+ VG_(OSet_Size)(CC_table));
+ VG_(message)(Vg_DebugMsg, "cachegrind: InstrInfo table size: %u",
+ VG_(OSet_Size)(instrInfoTable));
}
VGP_POPCC(VgpCacheResults);
}
@@ -1319,7 +1292,7 @@
// unmapped or modified, or for any arbitrary reason.
static void cg_discard_basic_block_info ( VexGuestExtents vge )
{
- VgHashNode* bbInfo;
+ BB_info* bbInfo;
=20
tl_assert(vge.n_used > 0);
=20
@@ -1328,10 +1301,9 @@
(void*)(Addr)vge.base[0], (ULong)vge.len[0]);
=20
// Get BB info, remove from table, free BB info. Simple!
- bbInfo =3D VG_(HT_remove)(instr_info_table, (UWord)vge.base[0]);
+ bbInfo =3D VG_(OSet_Remove)(instrInfoTable, &(vge.base[0]));
tl_assert(NULL !=3D bbInfo);
-
- VG_(free)(bbInfo);
+ VG_(OSet_FreeNode)(instrInfoTable, bbInfo);
}
=20
/*--------------------------------------------------------------------*/
@@ -1449,7 +1421,15 @@
VG_(sprintf)(cachegrind_out_file, "%s/cachegrind.out.%d",
base_dir, VG_(getpid)());
=20
- instr_info_table =3D VG_(HT_construct)( 4999 ); // prime, biggish
+ CC_table =3D VG_(OSet_Create)(offsetof(LineCC, loc),
+ cmp_CodeLoc_LineCC,
+ VG_(malloc), VG_(free));
+ instrInfoTable =3D VG_(OSet_Create)(offsetof(BB_info, BB_addr),
+ NULL,
+ VG_(malloc), VG_(free));
+ stringTable =3D VG_(OSet_Create)(/*keyOff*/0,
+ stringCmp,
+ VG_(malloc), VG_(free));
}
=20
VG_DETERMINE_INTERFACE_VERSION(cg_pre_clo_init)
@@ -1457,3 +1437,4 @@
/*--------------------------------------------------------------------*/
/*--- end ---*/
/*--------------------------------------------------------------------*/
+
|
|
From: <sv...@va...> - 2005-10-15 17:18:11
|
Author: njn
Date: 2005-10-15 18:18:08 +0100 (Sat, 15 Oct 2005)
New Revision: 4932
Log:
Clarify the disInstr message.
Modified:
trunk/coregrind/m_scheduler/scheduler.c
Modified: trunk/coregrind/m_scheduler/scheduler.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_scheduler/scheduler.c 2005-10-15 16:53:04 UTC (rev =
4931)
+++ trunk/coregrind/m_scheduler/scheduler.c 2005-10-15 17:18:08 UTC (rev =
4932)
@@ -781,13 +781,16 @@
=20
case VEX_TRC_JMP_NODECODE:
#define M(a) VG_(message)(Vg_UserMsg, a);
- M("Your program just tried to execute an instruction that Valgrind");
- M("did not recognise. This might be because your program has a bug")=
;
- M("and erroneously jumped to a non-code location. If you are running=
");
- M("Memcheck, you might have just seen a warning about a bad jump,");
- M("which is a good indication that this is so. Or it might be" );
- M("because the instruction is unimplemented in Valgrind; if you");
- M("think this is the case, or you are not sure, please let us know.")=
;
+ M("Your program just tried to execute an instruction that Valgrind" )=
;
+ M("did not recognise. There are two possible reasons for this." )=
;
+ M("1. Your program has a bug and erroneously jumped to a non-code" )=
;
+ M(" location. If you are running Memcheck and you just saw a" )=
;
+ M(" warning about a bad jump, it's probably your program's fault.")=
;
+ M("2. The instruction is legitimate but Valgrind doesn't handle it,")=
;
+ M(" i.e. it's Valgrind's fault. If you think this is the case or")=
;
+ M(" you are not sure, please let us know." )=
;
+ M("Either way, Valgrind will now raise a SIGILL signal which will" )=
;
+ M("probably kill your program." )=
;
#undef M
VG_(synth_sigill)(tid, VG_(get_IP)(tid));
break;
|
|
From: <sv...@va...> - 2005-10-15 16:53:07
|
Author: njn
Date: 2005-10-15 17:53:04 +0100 (Sat, 15 Oct 2005)
New Revision: 4931
Log:
update roadmap
Modified:
trunk/docs/internals/roadmap.txt
Modified: trunk/docs/internals/roadmap.txt
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=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/docs/internals/roadmap.txt 2005-10-15 15:48:52 UTC (rev 4930)
+++ trunk/docs/internals/roadmap.txt 2005-10-15 16:53:04 UTC (rev 4931)
@@ -25,18 +25,22 @@
4. With --trace-children=3Dyes, allow 32-bit programs to exec 64-bit
programs and vice versa, and invoke the appropriate Valgrind
automatically.
+ [Underway, by Tom]
=20
* Get PPC32 working usably with Memcheck (Julian). Has already improved=
a
lot since. Get Cachegrind working with it (Nick).
+ [Both almost there, by Julian]
=20
* Rewrite address space manager; statically link the core with
- each tool; remove all glibc dependencies (Julian). [What about
- --time-stamp=3Dyes?]
+ each tool; remove all glibc dependencies (Julian). =20
+ [Done by Julian]
+ [What about --time-stamp=3Dyes?]
=20
* Make it work with GCC 2.95 (bug #111781) -- don't put declarations aft=
er
statements in blocks. Do it after merging ASPACEM with the trunk.
-Wdeclaration-after-statement is the GCC warning that detects this, bu=
t
it is only present in GCC after 3.4.0 (ie. not in 3.0.X--3.3.X)...
+ [Done by Tom and others]
=20
Maybe
-----
|
|
From: Tom H. <to...@co...> - 2005-10-15 16:32:32
|
In message <200...@gm...>
Josef Weidendorfer <Jos...@gm...> wrote:
> * As was discussed when introducing the static linking, a nice
> property now is that external tools can work - and thus, be
> distributed - on its own. The missing thing here is the launcher.
> What is the launcher doing exactly? When I run a static tool
> directly, I get a SEGFAULT.
All the launcher does is decided which tool to run and exec it - there
should be no need for a tool writer to recreate the launcher as it will
try and run unknown tools quite happily.
Basically it takes the argument to --tool and then just does an exec
of /usr/lib/valgrind/<tool> so if you install a statically linked callgrind
binary in the valgrind library directory it should all work.
I don't know why you get a segmentation fault when you run a tool
directly - that used to work, and was a useful way of debugging the
tools but Julian disabled it when he added the stuff to pass through
the launcher name for client execs. It now does this for me:
dunsmere [~] % /tmp/valgrind-debug/lib/valgrind/memcheck date
valgrind: You cannot run '/tmp/valgrind-debug/lib/valgrind/memcheck' directly.
valgrind: You should use $prefix/bin/valgrind.
> Do you think the launcher will change a lot with VG releases? If yes,
> it would be good to make a library here, too. If not, I simply could
> copy m_launcher.c into callgrind (to produce a "callgrind" binary),
> or do you see a problem with this?
Well there is some work pending on the launcher to enable biarch
support where it will work out which version of the tool to run
based on the architecture of the binary it is running.
At that point the tools will move down a level so the launcher
will exec something like /usr/lib/valgrind/x86-linux/memcheck.
> The thing here is to get binary packages for external tools which are
> independent from any installed VG version / do not depend on a VG
> installation at all. This would mean that you can always install the
> newest valgrind nearside an older callgrind, without me being
> forced to deliver a callgrind release matching the newest VG ;-)
The default valgrind launcher should generally work fine with
newer/older tools I would expect.
Tom
--
Tom Hughes (to...@co...)
http://www.compton.nu/
|
|
From: Josef W. <Jos...@gm...> - 2005-10-15 15:55:37
|
Hi, it seems that VG 3.1. comes along nicely. In adding support for it in callgrind, there are some changes required as tools are linked statically now: * VG should install the needed library(ies) so that an external tool can be statically linked. * As was discussed when introducing the static linking, a nice property now is that external tools can work - and thus, be distributed - on its own. The missing thing here is the launcher. What is the launcher doing exactly? When I run a static tool directly, I get a SEGFAULT. Do you think the launcher will change a lot with VG releases? If yes, it would be good to make a library here, too. If not, I simply could copy m_launcher.c into callgrind (to produce a "callgrind" binary), or do you see a problem with this? The thing here is to get binary packages for external tools which are independent from any installed VG version / do not depend on a VG installation at all. This would mean that you can always install the newest valgrind nearside an older callgrind, without me being forced to deliver a callgrind release matching the newest VG ;-) Josef |
|
From: <sv...@va...> - 2005-10-15 15:48:57
|
Author: njn
Date: 2005-10-15 16:48:52 +0100 (Sat, 15 Oct 2005)
New Revision: 4930
Log:
OSet-ify m_redir.c.
Modified:
trunk/coregrind/m_redir.c
Modified: trunk/coregrind/m_redir.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_redir.c 2005-10-15 15:28:31 UTC (rev 4929)
+++ trunk/coregrind/m_redir.c 2005-10-15 15:48:52 UTC (rev 4930)
@@ -38,8 +38,8 @@
#include "pub_core_libcprint.h"
#include "pub_core_mallocfree.h"
#include "pub_core_options.h"
+#include "pub_core_oset.h"
#include "pub_core_redir.h"
-#include "pub_core_skiplist.h"
#include "pub_core_trampoline.h"
#include "pub_core_transtab.h"
=20
@@ -65,6 +65,8 @@
function's arguments and return value.
*/
struct _CodeRedirect {
+ Addr from_addr; /* old addr -- MUST BE THE FIRST WORD! */
+
enum redir_type {
R_REDIRECT, /* plain redirection */
R_WRAPPER, /* wrap with valgrind-internal code */
@@ -73,7 +75,6 @@
=20
const Char *from_lib; /* library qualifier pattern */
const Char *from_sym; /* symbol */
- Addr from_addr; /* old addr */
=20
Addr to_addr; /* used for redirection -- new addr */
const FuncWrapper *wrapper; /* used for wrapping */
@@ -81,17 +82,11 @@
CodeRedirect *next; /* next pointer on unresolved list */
};
=20
-static Char *straddr(void *p)
-{
- static Char buf[16];
- VG_(sprintf)(buf, "%p", *(Addr *)p);
- return buf;
-}
+static OSet* resolved_redirs;
=20
-static SkipList sk_resolved_redirs =3D=20
- VG_SKIPLIST_INIT(CodeRedirect, from_addr, VG_(cmp_Addr),=20
- straddr, VG_AR_SYMTAB);
-
+// We use a linked list here rather than an OSet, because we want to
+// traverse it and possibly remove elements as we look at them. OSet
+// doesn't support this very well.
static CodeRedirect *unresolved_redirs =3D NULL;
=20
static Bool soname_matches(const Char *pattern, const Char* soname)
@@ -124,8 +119,6 @@
=20
switch (redir->type) {
case R_REDIRECT: {
- CodeRedirect* r;
- =20
TRACE_REDIR(" redir resolved (%s:%s=3D%p -> %p)",=20
redir->from_lib, redir->from_sym, redir->from_addr,
redir->to_addr);
@@ -156,15 +149,16 @@
"add_redir_to_resolved_list");
}
=20
- r =3D VG_(SkipList_Find_Exact)(&sk_resolved_redirs, &redir->from_a=
ddr);
-
- if (r =3D=3D NULL) {
- VG_(SkipList_Insert)(&sk_resolved_redirs, redir);
+ // This entails a possible double OSet lookup -- one for Contains(=
),
+ // one for Insert(). If we had OSet_InsertIfNonDup() we could do =
it
+ // with one lookup.
+ if ( ! VG_(OSet_Contains)(resolved_redirs, &redir->from_addr) ) {
+ VG_(OSet_Insert)(resolved_redirs, redir);
} else {
- /* XXX leak redir */
TRACE_REDIR(" redir %s:%s:%p->%p duplicated\n",
redir->from_lib, redir->from_sym, redir->from_addr,
redir->to_addr);
+ VG_(arena_free)(VG_AR_SYMTAB, redir);
}
break;
}
@@ -253,8 +247,8 @@
__attribute__((unused)) // It is used, but not on all platforms...
static void add_redirect_addr_to_addr( Addr from_addr, Addr to_addr )
{
- CodeRedirect *redir =3D VG_(SkipNode_Alloc)(&sk_resolved_redirs);
-
+ CodeRedirect* redir =3D VG_(OSet_AllocNode)(resolved_redirs,
+ sizeof(CodeRedirect));
vg_assert(0 !=3D from_addr && 0 !=3D to_addr);
=20
redir->type =3D R_REDIRECT;
@@ -277,8 +271,8 @@
const Char *from_lib, const Char *from_sym, Addr to_addr
)
{
- CodeRedirect *redir =3D VG_(SkipNode_Alloc)(&sk_resolved_redirs);
-
+ CodeRedirect* redir =3D VG_(OSet_AllocNode)(resolved_redirs,
+ sizeof(CodeRedirect));
vg_assert(from_lib && from_sym && 0 !=3D to_addr);
=20
redir->type =3D R_REDIRECT;
@@ -304,8 +298,8 @@
CodeRedirect *VG_(add_wrapper)(const Char *from_lib, const Char *from_sy=
m,
const FuncWrapper *wrapper)
{
- CodeRedirect *redir =3D VG_(SkipNode_Alloc)(&sk_resolved_redirs);
-
+ CodeRedirect* redir =3D VG_(OSet_AllocNode)(resolved_redirs,
+ sizeof(CodeRedirect));
redir->type =3D R_WRAPPER;
redir->from_lib =3D VG_(arena_strdup)(VG_AR_SYMTAB, from_lib);
redir->from_sym =3D VG_(arena_strdup)(VG_AR_SYMTAB, from_sym);
@@ -331,9 +325,7 @@
address. */
Addr VG_(code_redirect)(Addr a)
{
- CodeRedirect* r;
-
- r =3D VG_(SkipList_Find_Exact)(&sk_resolved_redirs, &a);
+ CodeRedirect* r =3D VG_(OSet_Lookup)(resolved_redirs, &a);
if (r =3D=3D NULL)
return a;
=20
@@ -342,8 +334,24 @@
return r->to_addr;
}
=20
+static void* symtab_alloc(SizeT n)
+{
+ return VG_(arena_malloc)(VG_AR_SYMTAB, n);
+}
+
+static void symtab_free(void* p)
+{
+ return VG_(arena_free)(VG_AR_SYMTAB, p);
+}
+
void VG_(setup_code_redirect_table) ( void )
{
+ // Initialise resolved_redirs list.
+ resolved_redirs =3D VG_(OSet_Create)(offsetof(CodeRedirect, from_addr=
),
+ NULL, // Use fast comparison
+ symtab_alloc,
+ symtab_free);
+
#if defined(VGP_x86_linux)
/* Redirect _dl_sysinfo_int80, which is glibc's default system call
routine, to our copy so that the special sysinfo unwind hack in
@@ -375,10 +383,6 @@
"soname:ld.so.1", "strcmp",
(Addr)&VG_(ppc32_linux_REDIR_FOR_strcmp)
); =20
- add_redirect_sym_to_addr(
- "soname:ld.so.1", "index",
- (Addr)&VG_(ppc32_linux_REDIR_FOR_strchr)
- ); =20
=20
#else
# error Unknown platform
|
|
From: <sv...@va...> - 2005-10-15 15:28:36
|
Author: njn Date: 2005-10-15 16:28:31 +0100 (Sat, 15 Oct 2005) New Revision: 4929 Log: Fix 'shell' for those lacking '.' in their $PATH, hopefully. Modified: trunk/none/tests/shell trunk/none/tests/shell.stderr.exp trunk/none/tests/shell.stdout.exp Modified: trunk/none/tests/shell =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=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/none/tests/shell 2005-10-15 13:01:21 UTC (rev 4928) +++ trunk/none/tests/shell 2005-10-15 15:28:31 UTC (rev 4929) @@ -7,35 +7,35 @@ #-----------------------------------------------------------------------= ----- =20 echo "Execute a directory" -x86/ +./x86/ =20 -echo "Execute a directory (2)" -x86 - echo "Execute a non-executable file" -shell.vgtest +./shell.vgtest =20 echo "Execute a script with a bad interpreter name" -shell_badinterp +./shell_badinterp =20 echo "Execute a binary file" -shell_binaryfile +./shell_binaryfile =20 echo "Execute a non-existent file" +./shell_nosuchfile + +echo "Execute a non-existent file (2)" shell_nosuchfile =20 #-----------------------------------------------------------------------= ----- # Shell scripts that should pass #-----------------------------------------------------------------------= ----- echo "Execute a valid script with a #! line" -shell_valid1 +./shell_valid1 =20 echo "Execute a valid script without a #! line" -shell_valid2 +./shell_valid2 =20 echo "Execute a valid script with #! but no interpname" -shell_valid3 +./shell_valid3 =20 echo "Execute a zero-length file" -shell_zerolength +./shell_zerolength =20 Modified: trunk/none/tests/shell.stderr.exp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=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/none/tests/shell.stderr.exp 2005-10-15 13:01:21 UTC (rev 4928) +++ trunk/none/tests/shell.stderr.exp 2005-10-15 15:28:31 UTC (rev 4929) @@ -1,8 +1,6 @@ =20 -./shell: x86/: is a directory +./shell: ./x86/: is a directory =20 -./shell: x86: command not found - ./shell: ./shell.vgtest: Permission denied =20 execve(0x........(./shell_badinterp), 0x........, 0x........) failed, er= rno 2 @@ -10,6 +8,8 @@ Add more stringent tests in PRE(sys_execve), or work out how to recover. ./shell: ./shell_binaryfile: cannot execute binary file =20 +./shell: ./shell_nosuchfile: No such file or directory + ./shell: shell_nosuchfile: command not found =20 =20 Modified: trunk/none/tests/shell.stdout.exp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=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/none/tests/shell.stdout.exp 2005-10-15 13:01:21 UTC (rev 4928) +++ trunk/none/tests/shell.stdout.exp 2005-10-15 15:28:31 UTC (rev 4929) @@ -1,9 +1,9 @@ Execute a directory -Execute a directory (2) Execute a non-executable file Execute a script with a bad interpreter name Execute a binary file Execute a non-existent file +Execute a non-existent file (2) Execute a valid script with a #! line Execute a valid script without a #! line Execute a valid script with #! but no interpname |
|
From: Josef W. <Jos...@gm...> - 2005-10-15 15:18:55
|
On Saturday 15 October 2005 08:58, you wrote: > Nicholas Nethercote writes: > > If this part of the simulation is taking a lot of time (and I'd like to > > see profiling evidence) I'd suggest keeping the current algorithm and > > having several specialised versions, for associativities of 1, 2, 4, and > > 8. It should be ugly but doable with some macro magic. > > My point was that if the cpu we are running on uses this pseudo-LRU > algorithm, cachegrind should use it too, because it will give results > that more accurately reflect what the actual hardware will do. I do not think it matters much. If we want to match the hardware in every detail, we would have to change the simulation in other ways: e.g. the tracecache for L1I in P4, the "sectored" caches on intel (always prefetch the neighboured line in addition on a read), the write-back behavior of L2, the hardware prefetcher, the multiple outstanding loads because of OOO, and so on. There is not much point in adding all these things, as a lot is not really documented, and it makes the simulation much slower. You can have a look at callgrind: I optionally added write-back events, and put in a hardware prefetcher to get a best-case szenario. The nice thing of LRU is that it is a quite simply model, the results are somewhat meaningful, and it is easy to check if the simulator is really doing LRU instead of being buggy, given a specially tailored program. If you have a pseudo-LRU, it is more difficult to check that. > I'm > pretty sure the PPC970 (G5) uses pseudo-LRU replacement for the L2 > cache, which is 8-way set associative. Is this officially documented somewhere? > I have no idea what intel or > AMD cpus use, though. They are quite probably doing pseudo-LRU too, but I never saw something hint how this is implemented in detail. So I would say, switching to a pseuo-LRU scheme is worth it if it really speeds up the simulation. It would be nice to choose between the schemes via CLO, and default to the pseudo-LRU. This way, you can compare the 2 schemes. Julian: I really would like to add handling of software-prefetching instructions. Is there a way for a tool to get some hints from IR in this regard? Similar for non-temporal loads. These things can make quite a huge difference for cache simulation. If there is a cache invalidation instruction on ppc32, this also would be a candidate to be detectable by tools. Josef > > Paul. |
|
From: Tom H. <to...@co...> - 2005-10-15 13:03:06
|
In message <Pin...@ch...>
Nicholas Nethercote <nj...@cs...> wrote:
> On Sat, 15 Oct 2005, Tom Hughes wrote:
>
> > =================================================
> > == Difference between 24 hours ago and now ==
> > =================================================
> >
> > + none/tests/shell (stderr)
> > + none/tests/shell_valid1 (stderr)
>
> Can you send me the *.out files from these? Thanks.
I'm not seeing shell_valid1 failing at the moment - the other one was
because newer versions of bash include the line number in the error
message when running a program from a script. I've added a stripper
to get rid of the line numbers.
Tom
--
Tom Hughes (to...@co...)
http://www.compton.nu/
|
|
From: <sv...@va...> - 2005-10-15 13:01:27
|
Author: tom Date: 2005-10-15 14:01:21 +0100 (Sat, 15 Oct 2005) New Revision: 4928 Log: Filter out line numbers from shell error messages. Added: trunk/none/tests/filter_linenos Modified: trunk/none/tests/shell.vgtest Added: trunk/none/tests/filter_linenos =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=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/none/tests/filter_linenos 2005-10-15 02:00:41 UTC (rev 4927) +++ trunk/none/tests/filter_linenos 2005-10-15 13:01:21 UTC (rev 4928) @@ -0,0 +1,5 @@ +#!/bin/sh + +dir=3D`dirname $0` + +$dir/filter_stderr | sed "s/ line [0-9]*://" Property changes on: trunk/none/tests/filter_linenos ___________________________________________________________________ Name: svn:executable + * Modified: trunk/none/tests/shell.vgtest =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=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/none/tests/shell.vgtest 2005-10-15 02:00:41 UTC (rev 4927) +++ trunk/none/tests/shell.vgtest 2005-10-15 13:01:21 UTC (rev 4928) @@ -1 +1,2 @@ prog: shell +stderr_filter: filter_linenos |
|
From: Paul M. <pa...@sa...> - 2005-10-15 07:47:34
|
Nicholas Nethercote writes: > If this part of the simulation is taking a lot of time (and I'd like to > see profiling evidence) I'd suggest keeping the current algorithm and > having several specialised versions, for associativities of 1, 2, 4, and > 8. It should be ugly but doable with some macro magic. My point was that if the cpu we are running on uses this pseudo-LRU algorithm, cachegrind should use it too, because it will give results that more accurately reflect what the actual hardware will do. I'm pretty sure the PPC970 (G5) uses pseudo-LRU replacement for the L2 cache, which is 8-way set associative. I have no idea what intel or AMD cpus use, though. Paul. |
|
From: Nicholas N. <nj...@cs...> - 2005-10-15 03:47:33
|
On Sat, 15 Oct 2005, Tom Hughes wrote: > ================================================= > == Difference between 24 hours ago and now == > ================================================= > > + none/tests/shell (stderr) > + none/tests/shell_valid1 (stderr) Can you send me the *.out files from these? Thanks. Nick |
|
From: <js...@ac...> - 2005-10-15 02:52:41
|
Nightly build on phoenix ( SuSE 9.1 ) started at 2005-10-15 03:30:00 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 == 200 tests, 3 stderr failures, 0 stdout failures ================= none/tests/faultstatus (stderr) none/tests/shell (stderr) none/tests/x86/int (stderr) ================================================= == Results from 24 hours ago == ================================================= 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 == 190 tests, 2 stderr failures, 0 stdout failures ================= none/tests/faultstatus (stderr) none/tests/x86/int (stderr) ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short Sat Oct 15 03:41:15 2005 --- new.short Sat Oct 15 03:52:33 2005 *************** *** 10,13 **** ! == 190 tests, 2 stderr failures, 0 stdout failures ================= none/tests/faultstatus (stderr) none/tests/x86/int (stderr) --- 10,14 ---- ! == 200 tests, 3 stderr failures, 0 stdout failures ================= none/tests/faultstatus (stderr) + none/tests/shell (stderr) none/tests/x86/int (stderr) |
|
From: Tom H. <to...@co...> - 2005-10-15 02:40:22
|
Nightly build on dunsmere ( athlon, Fedora Core 4 ) started at 2005-10-15 03:30:05 BST 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 == 202 tests, 13 stderr failures, 4 stdout failures ================= memcheck/tests/leak-tree (stderr) memcheck/tests/mempool (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/weirdioctl (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/xml1 (stderr) none/tests/faultstatus (stderr) none/tests/map_unmap (stdout) none/tests/map_unmap (stderr) none/tests/mremap2 (stdout) none/tests/shell (stderr) none/tests/shell_valid1 (stderr) none/tests/sigstackgrowth (stdout) none/tests/sigstackgrowth (stderr) none/tests/stackgrowth (stdout) none/tests/stackgrowth (stderr) none/tests/x86/int (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 == 192 tests, 14 stderr failures, 5 stdout failures ================= memcheck/tests/describe-block (stderr) memcheck/tests/leak-tree (stderr) memcheck/tests/mempool (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/strchr (stderr) memcheck/tests/weirdioctl (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/xml1 (stderr) none/tests/faultstatus (stderr) none/tests/map_unmap (stdout) none/tests/map_unmap (stderr) none/tests/mremap2 (stdout) none/tests/sigstackgrowth (stdout) none/tests/sigstackgrowth (stderr) none/tests/stackgrowth (stdout) none/tests/stackgrowth (stderr) none/tests/x86/insn_fpu (stdout) none/tests/x86/insn_fpu (stderr) none/tests/x86/int (stderr) ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short Sat Oct 15 03:35:13 2005 --- new.short Sat Oct 15 03:40:17 2005 *************** *** 8,11 **** ! == 192 tests, 14 stderr failures, 5 stdout failures ================= ! memcheck/tests/describe-block (stderr) memcheck/tests/leak-tree (stderr) --- 8,10 ---- ! == 202 tests, 13 stderr failures, 4 stdout failures ================= memcheck/tests/leak-tree (stderr) *************** *** 13,15 **** memcheck/tests/pointer-trace (stderr) - memcheck/tests/strchr (stderr) memcheck/tests/weirdioctl (stderr) --- 12,13 ---- *************** *** 21,22 **** --- 19,22 ---- none/tests/mremap2 (stdout) + none/tests/shell (stderr) + none/tests/shell_valid1 (stderr) none/tests/sigstackgrowth (stdout) *************** *** 25,28 **** none/tests/stackgrowth (stderr) - none/tests/x86/insn_fpu (stdout) - none/tests/x86/insn_fpu (stderr) none/tests/x86/int (stderr) --- 25,26 ---- |
|
From: Tom H. <th...@cy...> - 2005-10-15 02:27:33
|
Nightly build on alvis ( i686, Red Hat 7.3 ) started at 2005-10-15 03:15:02 BST 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 == 201 tests, 17 stderr failures, 0 stdout failures ================= memcheck/tests/addressable (stderr) memcheck/tests/describe-block (stderr) memcheck/tests/erringfds (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/mempool (stderr) memcheck/tests/nanoleak (stderr) memcheck/tests/partiallydefinedeq (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/sigkill (stderr) memcheck/tests/stack_changes (stderr) none/tests/faultstatus (stderr) none/tests/shell (stderr) none/tests/x86/int (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 == 191 tests, 16 stderr failures, 0 stdout failures ================= memcheck/tests/addressable (stderr) memcheck/tests/describe-block (stderr) memcheck/tests/erringfds (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/mempool (stderr) memcheck/tests/nanoleak (stderr) memcheck/tests/partiallydefinedeq (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/sigkill (stderr) memcheck/tests/stack_changes (stderr) none/tests/faultstatus (stderr) none/tests/x86/int (stderr) ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short Sat Oct 15 03:21:21 2005 --- new.short Sat Oct 15 03:27:28 2005 *************** *** 8,10 **** ! == 191 tests, 16 stderr failures, 0 stdout failures ================= memcheck/tests/addressable (stderr) --- 8,10 ---- ! == 201 tests, 17 stderr failures, 0 stdout failures ================= memcheck/tests/addressable (stderr) *************** *** 24,25 **** --- 24,26 ---- none/tests/faultstatus (stderr) + none/tests/shell (stderr) none/tests/x86/int (stderr) |
|
From: Tom H. <th...@cy...> - 2005-10-15 02:26:11
|
Nightly build on ginetta ( i686, Red Hat 8.0 ) started at 2005-10-15 03:10:12 BST 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 == 201 tests, 5 stderr failures, 0 stdout failures ================= memcheck/tests/mempool (stderr) memcheck/tests/pointer-trace (stderr) none/tests/faultstatus (stderr) none/tests/shell (stderr) none/tests/x86/int (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 == 191 tests, 4 stderr failures, 0 stdout failures ================= memcheck/tests/mempool (stderr) memcheck/tests/pointer-trace (stderr) none/tests/faultstatus (stderr) none/tests/x86/int (stderr) ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short Sat Oct 15 03:19:55 2005 --- new.short Sat Oct 15 03:26:03 2005 *************** *** 8,10 **** ! == 191 tests, 4 stderr failures, 0 stdout failures ================= memcheck/tests/mempool (stderr) --- 8,10 ---- ! == 201 tests, 5 stderr failures, 0 stdout failures ================= memcheck/tests/mempool (stderr) *************** *** 12,13 **** --- 12,14 ---- none/tests/faultstatus (stderr) + none/tests/shell (stderr) none/tests/x86/int (stderr) |
|
From: Tom H. <th...@cy...> - 2005-10-15 02:24:04
|
Nightly build on gill ( x86_64, Fedora Core 2 ) started at 2005-10-15 03:00:03 BST 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 == 176 tests, 9 stderr failures, 2 stdout failures ================= memcheck/tests/sigprocmask (stderr) memcheck/tests/strchr (stderr) memcheck/tests/weirdioctl (stderr) memcheck/tests/xml1 (stderr) none/tests/as_mmap (stderr) none/tests/as_shm (stdout) none/tests/as_shm (stderr) none/tests/faultstatus (stderr) none/tests/fdleak_fcntl (stderr) none/tests/shell (stderr) none/tests/tls (stdout) ================================================= == 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 == 166 tests, 8 stderr failures, 2 stdout failures ================= memcheck/tests/sigprocmask (stderr) memcheck/tests/strchr (stderr) memcheck/tests/weirdioctl (stderr) memcheck/tests/xml1 (stderr) none/tests/as_mmap (stderr) none/tests/as_shm (stdout) none/tests/as_shm (stderr) none/tests/faultstatus (stderr) none/tests/fdleak_fcntl (stderr) none/tests/tls (stdout) ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short Sat Oct 15 03:09:56 2005 --- new.short Sat Oct 15 03:23:40 2005 *************** *** 8,10 **** ! == 166 tests, 8 stderr failures, 2 stdout failures ================= memcheck/tests/sigprocmask (stderr) --- 8,10 ---- ! == 176 tests, 9 stderr failures, 2 stdout failures ================= memcheck/tests/sigprocmask (stderr) *************** *** 18,19 **** --- 18,20 ---- none/tests/fdleak_fcntl (stderr) + none/tests/shell (stderr) none/tests/tls (stdout) |
|
From: Tom H. <th...@cy...> - 2005-10-15 02:21:54
|
Nightly build on dellow ( x86_64, Fedora Core 4 ) started at 2005-10-15 03:10:12 BST 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 == 176 tests, 8 stderr failures, 2 stdout failures ================= memcheck/tests/sigprocmask (stderr) memcheck/tests/strchr (stderr) memcheck/tests/weirdioctl (stderr) memcheck/tests/xml1 (stderr) none/tests/as_mmap (stderr) none/tests/as_shm (stdout) none/tests/as_shm (stderr) none/tests/faultstatus (stderr) none/tests/mremap2 (stdout) none/tests/shell (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 == 166 tests, 7 stderr failures, 2 stdout failures ================= memcheck/tests/sigprocmask (stderr) memcheck/tests/strchr (stderr) memcheck/tests/weirdioctl (stderr) memcheck/tests/xml1 (stderr) none/tests/as_mmap (stderr) none/tests/as_shm (stdout) none/tests/as_shm (stderr) none/tests/faultstatus (stderr) none/tests/mremap2 (stdout) ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short Sat Oct 15 03:17:38 2005 --- new.short Sat Oct 15 03:21:33 2005 *************** *** 8,10 **** ! == 166 tests, 7 stderr failures, 2 stdout failures ================= memcheck/tests/sigprocmask (stderr) --- 8,10 ---- ! == 176 tests, 8 stderr failures, 2 stdout failures ================= memcheck/tests/sigprocmask (stderr) *************** *** 18,19 **** --- 18,20 ---- none/tests/mremap2 (stdout) + none/tests/shell (stderr) |