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
(9) |
2
(19) |
|
3
(5) |
4
(20) |
5
(5) |
6
(9) |
7
(6) |
8
(8) |
9
(5) |
|
10
(5) |
11
(5) |
12
(7) |
13
(7) |
14
(6) |
15
(5) |
16
(5) |
|
17
(5) |
18
(7) |
19
(21) |
20
(9) |
21
(6) |
22
(8) |
23
(6) |
|
24
(9) |
25
(9) |
26
(8) |
27
(19) |
28
(15) |
29
(8) |
30
(5) |
|
31
(6) |
|
|
|
|
|
|
|
From: <sv...@va...> - 2008-08-28 20:35:22
|
Author: sewardj
Date: 2008-08-28 21:35:29 +0100 (Thu, 28 Aug 2008)
New Revision: 8560
Log:
Make this tool usable for the first time:
* disable lots of debug printing
* add a suppression which makes it not report ld-2.x.so poking
around during dynamic linking
Modified:
branches/SGCHECK/coregrind/m_debuginfo/debuginfo.c
branches/SGCHECK/exp-sgcheck/sg_main.c
branches/SGCHECK/glibc-2.X.supp.in
Modified: branches/SGCHECK/coregrind/m_debuginfo/debuginfo.c
===================================================================
--- branches/SGCHECK/coregrind/m_debuginfo/debuginfo.c 2008-08-28 19:29:29 UTC (rev 8559)
+++ branches/SGCHECK/coregrind/m_debuginfo/debuginfo.c 2008-08-28 20:35:29 UTC (rev 8560)
@@ -2551,8 +2551,9 @@
/* Ok, so collect it! */
tl_assert(var->name);
tl_assert(di->soname);
- VG_(printf)("XXXX %s %s %d\n", var->name,
- var->fileName?(HChar*)var->fileName:"??",var->lineNo);
+ if (0) VG_(printf)("XXXX %s %s %d\n", var->name,
+ var->fileName?(HChar*)var->fileName
+ :"??",var->lineNo);
VG_(memset)(&gb, 0, sizeof(gb));
gb.addr = res.word;
gb.szB = muw.w;
Modified: branches/SGCHECK/exp-sgcheck/sg_main.c
===================================================================
--- branches/SGCHECK/exp-sgcheck/sg_main.c 2008-08-28 19:29:29 UTC (rev 8559)
+++ branches/SGCHECK/exp-sgcheck/sg_main.c 2008-08-28 20:35:29 UTC (rev 8560)
@@ -1009,8 +1009,8 @@
for (i = 0; i < n; i++) {
GlobalBlock* gbp;
GlobalBlock* gb = VG_(indexXA)( gbs, i );
- VG_(printf)(" new Global size %2lu at %#lx: %s %s\n",
- gb->szB, gb->addr, gb->soname, gb->name );
+ if (0) VG_(printf)(" new Global size %2lu at %#lx: %s %s\n",
+ gb->szB, gb->addr, gb->soname, gb->name );
tl_assert(gb->szB > 0);
/* Make a persistent copy of each GlobalBlock, and add it
to the tree. */
@@ -1519,7 +1519,7 @@
static UWord ctr = 0;
Bool show = False;
- if (0 == (ctr++ & 0x1FFFFF)) show = True;
+ if (0 && 0 == (ctr++ & 0x1FFFFF)) show = True;
if (show) QCache__pp(cache, "before upd");
@@ -1766,8 +1766,10 @@
if (sb) stats__max_sitree_size = s;
if (gb) stats__max_gitree_size = g;
if (sb || gb)
- VG_(printf)("new max tree sizes: S size %ld, G size %ld\n",
- stats__max_sitree_size, stats__max_gitree_size );
+ VG_(message)(Vg_DebugMsg,
+ "exp-sgcheck: new max tree sizes: "
+ "StackTree %ld, GlobalTree %ld",
+ stats__max_sitree_size, stats__max_gitree_size );
}
} else {
caller->blocks_added_by_call = NULL;
@@ -2383,7 +2385,6 @@
static void pp_Error ( Error* err )
{
- const Bool show_raw_states = False;
XError *xe = (XError*)VG_(get_error_extra)(err);
switch (VG_(get_error_kind)(err)) {
Modified: branches/SGCHECK/glibc-2.X.supp.in
===================================================================
--- branches/SGCHECK/glibc-2.X.supp.in 2008-08-28 19:29:29 UTC (rev 8559)
+++ branches/SGCHECK/glibc-2.X.supp.in 2008-08-28 20:35:29 UTC (rev 8560)
@@ -222,3 +222,16 @@
obj:/lib/libpthread-0.10.so
fun:pthread_create
}
+
+##----------------------------------------------------------------------##
+##--- exp-sgcheck suppressions ---##
+##----------------------------------------------------------------------##
+
+{
+ ld-2.X poking around in god knows where
+ SGcheck:SorG
+ obj:/lib*/ld-@GLIBC_VERSION@*.so*
+ obj:/lib*/ld-@GLIBC_VERSION@*.so*
+ obj:/lib*/ld-@GLIBC_VERSION@*.so*
+ obj:/lib*/ld-@GLIBC_VERSION@*.so*
+}
Property changes on: branches/SGCHECK/glibc-2.X.supp.in
___________________________________________________________________
Name: svn:mergeinfo
-
|
|
From: <sv...@va...> - 2008-08-28 19:29:21
|
Author: sewardj
Date: 2008-08-28 20:29:29 +0100 (Thu, 28 Aug 2008)
New Revision: 8559
Log:
ML_(evaluate_trivial_GX): handle the sequence "DW_OP_addr;
DW_OP_GNU_push_tls_address" (whatever that might mean).
Modified:
branches/SGCHECK/coregrind/m_debuginfo/d3basics.c
Modified: branches/SGCHECK/coregrind/m_debuginfo/d3basics.c
===================================================================
--- branches/SGCHECK/coregrind/m_debuginfo/d3basics.c 2008-08-28 19:27:03 UTC (rev 8558)
+++ branches/SGCHECK/coregrind/m_debuginfo/d3basics.c 2008-08-28 19:29:29 UTC (rev 8559)
@@ -733,6 +733,12 @@
thisResult.b = True;
thisResult.w = *(Addr*)(p+1) + data_bias;
}
+ else if (nbytes == 2 + sizeof(Addr)
+ && *p == DW_OP_addr
+ && *(p + 1 + sizeof(Addr)) == DW_OP_GNU_push_tls_address) {
+ if (!badness)
+ badness = "trivial GExpr is DW_OP_addr plus trailing junk";
+ }
else if (nbytes >= 1 && *p >= DW_OP_reg0 && *p <= DW_OP_reg31) {
if (!badness)
badness = "trivial GExpr denotes register (1)";
|
|
From: <sv...@va...> - 2008-08-28 19:26:59
|
Author: sewardj
Date: 2008-08-28 20:27:03 +0100 (Thu, 28 Aug 2008)
New Revision: 8558
Log:
Be robust against debugging information which claims to have two
identical but differently sized stack blocks at the same fp/sp offset
(sigh ..)
Modified:
branches/SGCHECK/exp-sgcheck/sg_main.c
Modified: branches/SGCHECK/exp-sgcheck/sg_main.c
===================================================================
--- branches/SGCHECK/exp-sgcheck/sg_main.c 2008-08-28 14:12:37 UTC (rev 8557)
+++ branches/SGCHECK/exp-sgcheck/sg_main.c 2008-08-28 19:27:03 UTC (rev 8558)
@@ -196,6 +196,22 @@
return r;
}
+/* Returns True if all fields except .szB are the same. szBs may or
+ may not be the same; they are simply not consulted. */
+static Bool StackBlock__all_fields_except_szB_are_equal (
+ StackBlock* fb1,
+ StackBlock* fb2
+ )
+{
+ tl_assert(StackBlock__sane(fb1));
+ tl_assert(StackBlock__sane(fb2));
+ return fb1->base == fb2->base
+ && fb1->spRel == fb2->spRel
+ && fb1->isVec == fb2->isVec
+ && 0 == VG_(strcmp)(fb1->name, fb2->name);
+}
+
+
/* Generate an arbitrary total ordering on vectors of StackBlocks. */
static Word StackBlocks__cmp ( XArray* fb1s, XArray* fb2s )
{
@@ -264,8 +280,9 @@
VG_(setCmpFnXA)( orig, (Int(*)(void*,void*))StackBlock__cmp );
VG_(sortXA)( orig );
- /* Now get rid of any duplicates. */
- { Word r, w, n = VG_(sizeXA)( orig ), nEQ;
+ /* Now get rid of any exact duplicates. */
+ nuke_dups:
+ { Word r, w, nEQ, n = VG_(sizeXA)( orig );
if (n >= 2) {
w = 0;
nEQ = 0;
@@ -293,6 +310,40 @@
}
}
+ /* Deal with the following strangeness, where two otherwise
+ identical blocks are claimed to have different sizes. In which
+ case we use the larger size. */
+ /* StackBlock{ off 16 szB 66 spRel:Y isVec:Y "sz" }
+ StackBlock{ off 16 szB 130 spRel:Y isVec:Y "sz" }
+ StackBlock{ off 208 szB 16 spRel:Y isVec:Y "ar" }
+ */
+ { Word i, n = VG_(sizeXA)( orig );
+ if (n >= 2) {
+ for (i = 0; i < n-1; i++) {
+ StackBlock* sb0 = VG_(indexXA)( orig, i+0 );
+ StackBlock* sb1 = VG_(indexXA)( orig, i+1 );
+ if (StackBlock__all_fields_except_szB_are_equal(sb0, sb1)) {
+ /* They can't be identical because the previous tidying
+ pass would have removed the duplicates. And they
+ can't be > because the earlier sorting pass would
+ have ordered otherwise-identical descriptors
+ according to < on .szB fields. Hence: */
+ tl_assert(sb0->szB < sb1->szB);
+ sb0->szB = sb1->szB;
+ /* This makes the blocks identical, at the size of the
+ larger one. Rather than go to all the hassle of
+ sliding the rest down, simply go back to the
+ remove-duplicates stage. The assertion guarantees
+ that we eventually make progress, since the rm-dups
+ stage will get rid of one of the blocks. This is
+ expected to happen only exceedingly rarely. */
+ tl_assert(StackBlock__cmp(sb0,sb1) == 0);
+ goto nuke_dups;
+ }
+ }
+ }
+ }
+
/* A rather poor sanity check on the results. */
{ Word i, n = VG_(sizeXA)( orig );
for (i = 0; i < n-1; i++) {
|
|
From: Evan G. <th...@gm...> - 2008-08-28 15:44:05
|
On Aug 28, 2008, at 7:32 AM, Ivan Jager wrote: > On Wed, 27 Aug 2008, Evan Geller wrote: >> My port is nearly done, minus floating point and VFP and neon and >> some other >> stuff, but it runs plenty of stuff just fine. Yes memcheck works >> fine too. >> Please don't start a port now :) It'd be a shame to have two >> separate ARM >> ports. >> >> And for the record it's a huge amount of work. Ivan's code isn't >> working >> either, since the flags aren't being set properly, and > > Oh, you didn't tell me about this. In which cases is it broken? I'm not even sure any more. It took me a good week or so to get the flags right, they were a total pain haha. It wasn't your code that was broken I don't think, I think it was CAB's code that you converted into IR (some of the stuff you commented "this doesn't look right...") Plus, there was some stuff being passed to the helper itself (carry out, etc.) that wasn't being set right. > > >> removing the flag thunks slows things down. > > Oh :(, how much is it slowing things down? I would have expected it > to be faster than what was already there, given that VEX could > optimize it. I could change it so that VEX would optimize away the > flags that aren't being used. > > My reasoning for not using thunks was: 1. ARM instructions have an S > bit which indicates whether or not you want them to set the > condition codes, and gcc only sets this bit when they will be used. > and 2. Many ARM instructions only set some of the CCs, meaning that > the thunk method would need to force the previous thunk again for > those instructions. > > But, perhaps GCC's optimizer is so much better than VEX's that it's > still faster to make the C call and have an extra branch based on > CC_OP before getting to basically the same code. Well, it's not so much that the code itself runs slower, it's that VEX is forced to traverse a massive IR tree. When memcheck instruments a binary, it tries trace everything through each IROp, meaning the code gets inflated significantly, as well as memcheck having to trace through that massive IR tree. Memcheck is better at tracking through helpers since it can see the flag setting as one discrete operation. It was a definitely a good move to remove the thunk itself, since x86 tends to be [flag set] [flag set] [flag set] [check flags], whereas ARM is [flag set] [check flag] [check flag], but setting the flags in IR makes for a lot of duplicate code in the translation cache and a lot of stuff to traverse. Sorry about that first email not being too well thought out, I was about to miss my shuttle home when I saw Shachen's email, so I sorta banged it out. > > >> Currently the flags are being calculated in IR but >> I plan to make that a helper. The tree is pretty dirty right now, I >> might >> just post a tarball somewhere so people can play with it. I haven't >> really >> talked to anyone from the valgrind project about actually >> integrating it in. >> The code is just really hashy right now, but it works. I'll try and >> have it >> up by next friday :-D > > Looking forward to seeing that, so I can do some testing. :) > > Ivan |
|
From: <sv...@va...> - 2008-08-28 14:12:29
|
Author: sewardj
Date: 2008-08-28 15:12:37 +0100 (Thu, 28 Aug 2008)
New Revision: 8557
Log:
Fix a couple of boundary cases seen on larger programs:
* tolerate exact-duplicate global blocks in add_block_to_GlobalTree
* classify_address: correctly handle blocks which overlap a stack/
global block boundary, when updating the query cache
Modified:
branches/SGCHECK/coregrind/m_wordfm.c
branches/SGCHECK/exp-sgcheck/sg_main.c
branches/SGCHECK/include/pub_tool_wordfm.h
Modified: branches/SGCHECK/coregrind/m_wordfm.c
===================================================================
--- branches/SGCHECK/coregrind/m_wordfm.c 2008-08-28 10:27:54 UTC (rev 8556)
+++ branches/SGCHECK/coregrind/m_wordfm.c 2008-08-28 14:12:37 UTC (rev 8557)
@@ -416,7 +416,7 @@
}
static
-void avl_find_bounds ( AvlNode* t,
+Bool avl_find_bounds ( AvlNode* t,
/*OUT*/UWord* kMinP, /*OUT*/UWord* kMaxP,
UWord minKey, UWord maxKey, UWord key,
Word(*kCmp)(UWord,UWord) )
@@ -438,11 +438,14 @@
}
/* We should never get here. If we do, it means the given key
is actually present in the tree, which means the original
- call was invalid -- an error on the caller's part. */
- tl_assert(0);
+ call was invalid -- an error on the caller's part, and we
+ cannot give any meaningful values for the bounds. (Well,
+ maybe we could, but we're not gonna. Ner!) */
+ return False;
}
*kMinP = lowerBound;
*kMaxP = upperBound;
+ return True;
}
// Clear the iterator stack.
@@ -650,11 +653,12 @@
}
// See comment in pub_tool_wordfm.h for explanation
-void VG_(findBoundsFM)( WordFM* fm,
+Bool VG_(findBoundsFM)( WordFM* fm,
/*OUT*/UWord* kMinP, /*OUT*/UWord* kMaxP,
UWord minKey, UWord maxKey, UWord key )
{
- avl_find_bounds( fm->root, kMinP, kMaxP, minKey, maxKey, key, fm->kCmp );
+ return avl_find_bounds( fm->root, kMinP, kMaxP, minKey, maxKey,
+ key, fm->kCmp );
}
UWord VG_(sizeFM) ( WordFM* fm )
Modified: branches/SGCHECK/exp-sgcheck/sg_main.c
===================================================================
--- branches/SGCHECK/exp-sgcheck/sg_main.c 2008-08-28 10:27:54 UTC (rev 8556)
+++ branches/SGCHECK/exp-sgcheck/sg_main.c 2008-08-28 14:12:37 UTC (rev 8557)
@@ -575,6 +575,30 @@
}
GlobalTreeNode;
+static void GlobalTreeNode__pp ( GlobalTreeNode* nd ) {
+ tl_assert(nd->descr);
+ VG_(printf)("GTNode [%#lx,+%ld) %s",
+ nd->addr, nd->szB, nd->descr->name);
+}
+
+static void GlobalTree__pp ( WordFM* /* of (GlobalTreeNode,void) */ gitree,
+ HChar* who )
+{
+ UWord keyW, valW;
+ GlobalTreeNode* nd;
+ VG_(printf)("<<< GlobalBlockTree (%s)\n", who);
+ VG_(initIterFM)( gitree );
+ while (VG_(nextIterFM)( gitree, &keyW, &valW )) {
+ tl_assert(valW == 0);
+ nd = (GlobalTreeNode*)keyW;
+ VG_(printf)(" ");
+ GlobalTreeNode__pp(nd);
+ VG_(printf)("\n");
+ }
+ VG_(doneIterFM)( gitree );
+ VG_(printf)(">>>\n");
+}
+
/* Interval comparison function for GlobalTreeNode */
static Word cmp_intervals_GlobalTreeNode ( GlobalTreeNode* gn1,
GlobalTreeNode* gn2 )
@@ -608,15 +632,45 @@
)
{
Bool already_present;
- GlobalTreeNode* nyu;
+ GlobalTreeNode *nyu, *nd;
+ UWord keyW, valW;
tl_assert(descr->szB > 0);
nyu = pc_malloc( sizeof(GlobalTreeNode) );
nyu->addr = descr->addr;
nyu->szB = descr->szB;
nyu->descr = descr;
+
+ /* Basically it's an error to add a global block to the tree that
+ is already in the tree. However, detect and ignore attempts to
+ insert exact duplicates; they do appear for some reason
+ (possible a bug in m_debuginfo?) */
+ already_present = VG_(lookupFM)( gitree, &keyW, &valW, (UWord)nyu );
+ if (already_present) {
+ tl_assert(valW == 0);
+ nd = (GlobalTreeNode*)keyW;
+ tl_assert(nd);
+ tl_assert(nd != nyu);
+ tl_assert(nd->descr);
+ tl_assert(nyu->descr);
+ if (nd->addr == nyu->addr && nd->szB == nyu->szB
+ && 0 == VG_(strcmp)(nd->descr->name, nyu->descr->name)
+ && 0 == VG_(strcmp)(nd->descr->soname, nyu->descr->soname)) {
+ /* exact duplicate; ignore it */
+ pc_free(nyu);
+ return;
+ }
+ /* else fall through; the assertion below will catch it */
+ }
+
already_present = VG_(addToFM)( gitree, (UWord)nyu, 0 );
/* The interval can't already be there; else we have
overlapping global blocks. */
+ if (already_present) {
+ GlobalTree__pp( gitree, "add_block_to_GlobalTree: non-exact duplicate" );
+ VG_(printf)("Overlapping block: ");
+ GlobalTreeNode__pp(nyu);
+ VG_(printf)("\n");
+ }
tl_assert(!already_present);
}
@@ -1408,9 +1462,9 @@
/* Update the cache */
out:
- { Word i;
- QCache* cache = &qcaches[tid];
- Word ip = cache->nInUse / 2; /* doesn't seem critical */
+ { Addr toadd_addr = 0;
+ SizeT toadd_szB = 0;
+ QCache* cache = &qcaches[tid];
static UWord ctr = 0;
Bool show = False;
@@ -1418,30 +1472,28 @@
if (show) QCache__pp(cache, "before upd");
- if (cache->nInUse < N_QCACHE)
- cache->nInUse++;
- for (i = cache->nInUse-1; i > ip; i--) {
- cache->elems[i] = cache->elems[i-1];
- }
-
switch (inv->tag) {
case Inv_Global:
- cache->elems[ip].addr = inv->Inv.Global.nd->addr;
- cache->elems[ip].szB = inv->Inv.Global.nd->szB;
- cache->elems[ip].inv = *inv;
+ toadd_addr = inv->Inv.Global.nd->addr;
+ toadd_szB = inv->Inv.Global.nd->szB;
break;
case Inv_StackN:
- cache->elems[ip].addr = inv->Inv.StackN.nd->addr;
- cache->elems[ip].szB = inv->Inv.StackN.nd->szB;
- cache->elems[ip].inv = *inv;
+ toadd_addr = inv->Inv.StackN.nd->addr;
+ toadd_szB = inv->Inv.StackN.nd->szB;
break;
case Inv_Unknown: {
/* This is more complex. We need to figure out the
intersection of the "holes" in the global and stack
- interval trees into which [ea,ea+szB) falls. */
+ interval trees into which [ea,ea+szB) falls. This is
+ further complicated by the fact that [ea,ea+szB) might
+ not fall cleanly into a hole; it may instead fall across
+ the boundary of a stack or global block. In that case
+ we just ignore it and don't update the cache, since we
+ have no way to represent this situation precisely. */
StackTreeNode sNegInf, sPosInf, sKey, *sLB, *sUB;
GlobalTreeNode gNegInf, gPosInf, gKey, *gLB, *gUB;
Addr gMin, gMax, sMin, sMax, uMin, uMax;
+ Bool sOK, gOK;
sNegInf.addr = 0;
sNegInf.szB = 1;
sPosInf.addr = ~(UWord)0;
@@ -1456,14 +1508,36 @@
gKey.szB = szB;
if (0) VG_(printf)("Tree sizes %ld %ld\n",
VG_(sizeFM)(siTrees[tid]), VG_(sizeFM)(giTree));
- VG_(findBoundsFM)( siTrees[tid],
- (UWord*)&sLB, (UWord*)&sUB,
- (UWord)&sNegInf, (UWord)&sPosInf,
- (UWord)&sKey );
- VG_(findBoundsFM)( giTree,
- (UWord*)&gLB, (UWord*)&gUB,
- (UWord)&gNegInf, (UWord)&gPosInf,
- (UWord)&gKey );
+ sOK = VG_(findBoundsFM)( siTrees[tid],
+ (UWord*)&sLB, (UWord*)&sUB,
+ (UWord)&sNegInf, (UWord)&sPosInf,
+ (UWord)&sKey );
+ gOK = VG_(findBoundsFM)( giTree,
+ (UWord*)&gLB, (UWord*)&gUB,
+ (UWord)&gNegInf, (UWord)&gPosInf,
+ (UWord)&gKey );
+ if (!(sOK && gOK)) {
+ /* If this happens, then [ea,ea+szB) partially overlaps
+ a heap or stack block. We can't represent that, so
+ just forget it (should be very rare). However, do
+ maximum sanity checks first. */
+ if (!sOK) {
+ StackTreeNode* nd = find_StackTreeNode( siTrees[tid], ea );
+ /* "it does overlap a stack block */
+ tl_assert(nd);
+ /* "but does not completely fall with the block" */
+ tl_assert(!is_subinterval_of(nd->addr, nd->szB, ea, szB));
+ }
+ if (!gOK) {
+ GlobalTreeNode* nd = find_GlobalTreeNode( giTree, ea );
+ /* "it does overlap a global block */
+ tl_assert(nd);
+ /* "but does not completely fall with the block" */
+ tl_assert(!is_subinterval_of(nd->addr, nd->szB, ea, szB));
+ }
+ if (0) VG_(printf)("overlapping blocks in cache\n");
+ return;
+ }
sMin = sLB == &sNegInf ? 0 : (sLB->addr + sLB->szB);
sMax = sUB == &sPosInf ? ~(UWord)0 : (sUB->addr - 1);
gMin = gLB == &gNegInf ? 0 : (gLB->addr + gLB->szB);
@@ -1486,14 +1560,29 @@
fudge uMax. */
if (uMin < uMax && uMax == ~(UWord)0)
uMax--;
- cache->elems[ip].addr = uMin;
- cache->elems[ip].szB = uMax - uMin + 1;
- cache->elems[ip].inv = *inv;
+ toadd_addr = uMin;
+ toadd_szB = uMax - uMin + 1;
break;
}
default:
/* We should only be caching info for the above 3 cases */
tl_assert(0);
+ } /* switch (inv->tag) */
+
+ { /* and actually add this to the cache, finally */
+ Word i;
+ Word ip = cache->nInUse / 2; /* doesn't seem critical */
+
+ if (cache->nInUse < N_QCACHE)
+ cache->nInUse++;
+ for (i = cache->nInUse-1; i > ip; i--) {
+ cache->elems[i] = cache->elems[i-1];
+ }
+
+ tl_assert(toadd_szB > 0);
+ cache->elems[ip].addr = toadd_addr;
+ cache->elems[ip].szB = toadd_szB;
+ cache->elems[ip].inv = *inv;
}
if (show) QCache__pp(cache, "after upd");
Modified: branches/SGCHECK/include/pub_tool_wordfm.h
===================================================================
--- branches/SGCHECK/include/pub_tool_wordfm.h 2008-08-28 10:27:54 UTC (rev 8556)
+++ branches/SGCHECK/include/pub_tool_wordfm.h 2008-08-28 14:12:37 UTC (rev 8557)
@@ -99,12 +99,15 @@
/*OUT*/UWord* keyP, /*OUT*/UWord* valP, UWord key );
// Find the closest key values bracketing the given key, assuming the
-// given key is not present in the map (this is asserted for). minKey
-// and maxKey are the minimum and maximum possible key values. The
-// resulting bracket values are returned in *kMinP and *kMaxP. It
-// follows that if fm is empty then the returned values are simply
-// minKey and maxKey.
-void VG_(findBoundsFM)( WordFM* fm,
+// given key is not present in the map. minKey and maxKey are the
+// minimum and maximum possible key values. The resulting bracket
+// values are returned in *kMinP and *kMaxP. It follows that if fm is
+// empty then the returned values are simply minKey and maxKey.
+//
+// If the operation was successful (that is, the given key is not
+// present), True is returned. If the given key is in fact present,
+// False is returned, and *kMinP and *kMaxP are undefined.
+Bool VG_(findBoundsFM)( WordFM* fm,
/*OUT*/UWord* kMinP, /*OUT*/UWord* kMaxP,
UWord minKey, UWord maxKey, UWord key );
|
|
From: <sv...@va...> - 2008-08-28 10:27:46
|
Author: sewardj
Date: 2008-08-28 11:27:54 +0100 (Thu, 28 Aug 2008)
New Revision: 8556
Log:
Merge (from trunk r8534) (minimal changes needed to handle Dwarf3
var/type info produced by gcc-4.3.x).
Modified:
branches/SGCHECK/coregrind/m_debuginfo/readdwarf3.c
Modified: branches/SGCHECK/coregrind/m_debuginfo/readdwarf3.c
===================================================================
--- branches/SGCHECK/coregrind/m_debuginfo/readdwarf3.c 2008-08-28 10:26:40 UTC (rev 8555)
+++ branches/SGCHECK/coregrind/m_debuginfo/readdwarf3.c 2008-08-28 10:27:54 UTC (rev 8556)
@@ -2195,7 +2195,11 @@
goto acquire_Atom;
}
- if (dtag == DW_TAG_structure_type || dtag == DW_TAG_union_type) {
+ /* Treat DW_TAG_class_type as if it was a DW_TAG_structure_type. I
+ don't know if this is correct, but it at least makes this reader
+ usable for gcc-4.3 produced Dwarf3. */
+ if (dtag == DW_TAG_structure_type || dtag == DW_TAG_class_type
+ || dtag == DW_TAG_union_type) {
Bool have_szB = False;
Bool is_decl = False;
Bool is_spec = False;
@@ -2207,7 +2211,8 @@
= VG_(newXA)( ML_(dinfo_zalloc), ML_(dinfo_free),
sizeof(TyAtom*) );
type->Ty.StOrUn.complete = True;
- type->Ty.StOrUn.isStruct = dtag == DW_TAG_structure_type;
+ type->Ty.StOrUn.isStruct = dtag == DW_TAG_structure_type
+ || dtag == DW_TAG_class_type;
while (True) {
DW_AT attr = (DW_AT) get_ULEB128( c_abbv );
DW_FORM form = (DW_FORM)get_ULEB128( c_abbv );
|
|
From: <sv...@va...> - 2008-08-28 10:26:31
|
Author: sewardj
Date: 2008-08-28 11:26:40 +0100 (Thu, 28 Aug 2008)
New Revision: 8555
Log:
Performance improvements for the instruction-instance hash tables.
Split find_or_create_IInstance into fast and slow sections, and inline
the fast section.
Modified:
branches/SGCHECK/exp-sgcheck/sg_main.c
Modified: branches/SGCHECK/exp-sgcheck/sg_main.c
===================================================================
--- branches/SGCHECK/exp-sgcheck/sg_main.c 2008-08-27 17:41:56 UTC (rev 8554)
+++ branches/SGCHECK/exp-sgcheck/sg_main.c 2008-08-28 10:26:40 UTC (rev 8555)
@@ -983,7 +983,12 @@
static ULong stats__Invars_preened = 0;
static ULong stats__Invars_changed = 0;
static ULong stats__t_i_b_empty = 0;
+static ULong stats__htab_fast = 0;
+static ULong stats__htab_searches = 0;
+static ULong stats__htab_probes = 0;
+static ULong stats__htab_resizes = 0;
+
/* A dynamic instance of an instruction */
typedef
struct {
@@ -996,7 +1001,7 @@
IInstance;
-#define N_HTAB_FIXED 16
+#define N_HTAB_FIXED 64
typedef
struct _StackFrame {
@@ -1116,8 +1121,14 @@
}
+/* XXX this should be >> 2 on ppc32/64 since the bottom two bits
+ of the ip are guaranteed to be zero */
+inline static UWord compute_II_hash ( Addr ip, UWord htab_size ) {
+ return (ip >> 0) & (htab_size - 1);
+}
+
__attribute__((noinline))
-static void initialise_hash_table ( StackFrame* sf )
+static void initialise_II_hash_table ( StackFrame* sf )
{
UWord i;
sf->htab_size = N_HTAB_FIXED; /* initial hash table size */
@@ -1130,7 +1141,7 @@
__attribute__((noinline))
-static void resize_hash_table ( StackFrame* sf )
+static void resize_II_hash_table ( StackFrame* sf )
{
UWord i, j, ix, old_size, new_size;
IInstance *old_htab, *new_htab, *old;
@@ -1147,7 +1158,7 @@
old = &old_htab[i];
if (old->insn_addr == 0 /* NOT IN USE */)
continue;
- ix = (old->insn_addr >> 0) & (new_size - 1);
+ ix = compute_II_hash(old->insn_addr, new_size);
/* find out where to put this, in the new table */
j = new_size;
while (1) {
@@ -1175,9 +1186,9 @@
but anyway: */
j = 0;
for (i = 0; i < new_size; i++) {
- if (new_htab[i].insn_addr != 0) {
- j++;
- }
+ if (new_htab[i].insn_addr != 0) {
+ j++;
+ }
}
tl_assert(j == sf->htab_used);
if (0) VG_(printf)("resized tab for SF %p to %lu\n", sf, new_size);
@@ -1185,24 +1196,34 @@
__attribute__((noinline))
-static IInstance* find_or_create_IInstance (
+static IInstance* find_or_create_IInstance_SLOW (
StackFrame* sf,
Addr ip,
XArray* /* StackBlock */ ip_frameblocks
)
{
UWord i, ix;
- start_over:
+
+ stats__htab_searches++;
+
tl_assert(sf);
tl_assert(sf->htab);
- if (0) VG_(printf)("XXX ip %#lx size %lu used %lu\n",
- ip, sf->htab_size, sf->htab_used);
+ /* Make sure the table loading doesn't get too high. */
+ if (UNLIKELY(2 * sf->htab_used >= 1 * sf->htab_size)) {
+ stats__htab_resizes++;
+ resize_II_hash_table(sf);
+ }
tl_assert(2 * sf->htab_used <= sf->htab_size);
- ix = (ip >> 0) & (sf->htab_size - 1);
+ ix = compute_II_hash(ip, sf->htab_size);
i = sf->htab_size;
while (1) {
+ stats__htab_probes++;
+ /* Note that because of the way the fast-case handler works,
+ these two tests are actually redundant in the first iteration
+ of this loop. (Except they aren't redundant if the code just
+ above resized the table first. :-) */
if (sf->htab[ix].insn_addr == ip)
return &sf->htab[ix];
if (sf->htab[ix].insn_addr == 0)
@@ -1218,14 +1239,8 @@
if (ix == sf->htab_size) ix = 0;
}
- /* So now we've found a free slot at ix, and we can use that.
- Except, first check if we need to resize the table. If so,
- resize it, and start all over again. */
+ /* So now we've found a free slot at ix, and we can use that. */
tl_assert(sf->htab[ix].insn_addr == 0);
- if (2 * sf->htab_used >= 1 * sf->htab_size) {
- resize_hash_table(sf);
- goto start_over;
- }
/* Add a new record in this slot. */
tl_assert(ip != 0); /* CAN'T REPRESENT THIS */
@@ -1237,6 +1252,35 @@
}
+inline
+static IInstance* find_or_create_IInstance (
+ StackFrame* sf,
+ Addr ip,
+ XArray* /* StackBlock */ ip_frameblocks
+ )
+{
+ UWord ix = compute_II_hash(ip, sf->htab_size);
+ /* Is it in the first slot we come to? */
+ if (LIKELY(sf->htab[ix].insn_addr == ip)) {
+ stats__htab_fast++;
+ return &sf->htab[ix];
+ }
+ /* If the first slot we come to is empty, bag it. */
+ if (LIKELY(sf->htab[ix].insn_addr == 0)) {
+ stats__htab_fast++;
+ tl_assert(ip != 0);
+ sf->htab[ix].insn_addr = ip;
+ sf->htab[ix].blocks = ip_frameblocks;
+ sf->htab[ix].invar.tag = Inv_Unset;
+ sf->htab_used++;
+ return &sf->htab[ix];
+ }
+ /* Otherwise we hand off to the slow case, which searches other
+ slots, and optionally resizes the table if necessary. */
+ return find_or_create_IInstance_SLOW( sf, ip, ip_frameblocks );
+}
+
+
__attribute__((noinline))
static Addr calculate_StackBlock_EA ( StackBlock* descr,
Addr sp, Addr fp ) {
@@ -1304,7 +1348,8 @@
static UWord ctr = 0;
stats__qcache_queries++;
for (i = 0; i < cache->nInUse; i++) {
-tl_assert(cache->elems[i].addr + cache->elems[i].szB != 0);
+ if (0) /* expensive in a loop like this */
+ tl_assert(cache->elems[i].addr + cache->elems[i].szB != 0);
stats__qcache_probes++;
if (is_subinterval_of(cache->elems[i].addr,
cache->elems[i].szB, ea, szB)) {
@@ -1437,8 +1482,8 @@
tl_assert(uMin <= uMax);
tl_assert(uMin <= ea && ea+szB-1 <= uMax);
/* Finally, we can park [uMin,uMax] in the cache. However,
- if uMin is 0 and uMax is ~0, we can't represent the
- difference; hence fudge uMax. */
+ if uMax is ~0, we can't represent the difference; hence
+ fudge uMax. */
if (uMin < uMax && uMax == ~(UWord)0)
uMax--;
cache->elems[ip].addr = uMin;
@@ -1603,7 +1648,7 @@
}
/* This sets up .htab, .htab_size and .htab_used */
- initialise_hash_table( callee );
+ initialise_II_hash_table( callee );
callee->creation_sp = sp_post_call_insn;
callee->sp_at_call = 0; // not actually required ..
@@ -2023,7 +2068,7 @@
sframe->creation_sp = ~0UL;
/* This sets up .htab, .htab_size and .htab_used */
- initialise_hash_table( sframe );
+ initialise_II_hash_table( sframe );
/* ->depth, ->outer, ->inner are 0, NULL, NULL */
@@ -2301,13 +2346,15 @@
stats__Invars_preened, stats__Invars_changed);
VG_(message)(Vg_DebugMsg,
" t_i_b_MT: %'12llu", stats__t_i_b_empty);
- VG_(message)(Vg_DebugMsg,
- " qcache: %'12llu queries", stats__qcache_queries );
- VG_(message)(Vg_DebugMsg,
- " qcache: %'12llu probes", stats__qcache_probes );
- VG_(message)(Vg_DebugMsg,
- " qcache: %'12llu misses", stats__qcache_misses );
- VG_(message)(Vg_DebugMsg, "");
+ VG_(message)(Vg_DebugMsg,
+ " qcache: %'llu searches, %'llu probes, %'llu misses",
+ stats__qcache_queries, stats__qcache_probes, stats__qcache_misses);
+ VG_(message)(Vg_DebugMsg,
+ "htab-fast: %'llu hits",
+ stats__htab_fast);
+ VG_(message)(Vg_DebugMsg,
+ "htab-slow: %'llu searches, %'llu probes, %'llu resizes",
+ stats__htab_searches, stats__htab_probes, stats__htab_resizes);
}
static void sg_pre_clo_init(void)
|
|
From: Evan G. <th...@gm...> - 2008-08-28 06:18:29
|
No. Not yet. It's been my internship project for the past few months. I'll tar up my source tree and put it on a server by next friday for people to play with. I just want to tie up some loose ends. One warning though, it's not at all complete. It supports no floating point, no VFP (though it understands enough VFP to fake it so that setjmp and longjmp can do their context switches), clone() isn't implemented, there's bugs here and there, stack unwinding is really hacky (It works mostly with gcc generated code, up until the unwinder hits a variadic function), it only supports ARM, no thumb/thumbEE, etc, etc. However, I've had no problems running it on busybox. So, if you build for v4 with softfloat, most stuff should work. Maaaybe v6 since gcc seems to only like certain instructions like uxth/clz which are implemented. Anywho. I'll post it next week. /eazg On Aug 27, 2008, at 11:02 PM, Bart Van Assche wrote: > On Thu, Aug 28, 2008 at 4:39 AM, Evan Geller <th...@gm...> > wrote: >> My port is nearly done, minus floating point and VFP and neon and >> some other >> stuff, but it runs plenty of stuff just fine. Yes memcheck works >> fine too. >> Please don't start a port now :) It'd be a shame to have two >> separate ARM >> ports. > > Is the source code of this port already publicly available ? > > Bart. |
|
From: Bart V. A. <bar...@gm...> - 2008-08-28 06:02:19
|
On Thu, Aug 28, 2008 at 4:39 AM, Evan Geller <th...@gm...> wrote: > My port is nearly done, minus floating point and VFP and neon and some other > stuff, but it runs plenty of stuff just fine. Yes memcheck works fine too. > Please don't start a port now :) It'd be a shame to have two separate ARM > ports. Is the source code of this port already publicly available ? Bart. |
|
From: Tom H. <th...@cy...> - 2008-08-28 03:07:43
|
Nightly build on alvis ( i686, Red Hat 7.3 ) started at 2008-08-28 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 == 346 tests, 60 stderr failures, 1 stdout failure, 29 post failures == memcheck/tests/file_locking (stderr) memcheck/tests/leak-0 (stderr) memcheck/tests/leak-cycle (stderr) memcheck/tests/leak-regroot (stderr) memcheck/tests/leak-tree (stderr) memcheck/tests/long_namespace_xml (stderr) memcheck/tests/malloc_free_fill (stderr) memcheck/tests/origin1-yes (stderr) memcheck/tests/origin4-many (stderr) memcheck/tests/origin5-bz2 (stderr) memcheck/tests/pointer-trace (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/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) ================================================= == 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 == 345 tests, 60 stderr failures, 1 stdout failure, 29 post failures == memcheck/tests/file_locking (stderr) memcheck/tests/leak-0 (stderr) memcheck/tests/leak-cycle (stderr) memcheck/tests/leak-regroot (stderr) memcheck/tests/leak-tree (stderr) memcheck/tests/long_namespace_xml (stderr) memcheck/tests/malloc_free_fill (stderr) memcheck/tests/origin1-yes (stderr) memcheck/tests/origin4-many (stderr) memcheck/tests/origin5-bz2 (stderr) memcheck/tests/pointer-trace (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/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) ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short Thu Aug 28 03:47:57 2008 --- new.short Thu Aug 28 04:07:52 2008 *************** *** 8,10 **** ! == 345 tests, 60 stderr failures, 1 stdout failure, 29 post failures == memcheck/tests/file_locking (stderr) --- 8,10 ---- ! == 346 tests, 60 stderr failures, 1 stdout failure, 29 post failures == memcheck/tests/file_locking (stderr) |
|
From: Tom H. <th...@cy...> - 2008-08-28 02:54:30
|
Nightly build on aston ( x86_64, Fedora Core 5 ) started at 2008-08-28 03:20:04 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 == 444 tests, 8 stderr failures, 2 stdout failures, 0 post failures == memcheck/tests/file_locking (stderr) memcheck/tests/malloc_free_fill (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/x86/scalar (stderr) none/tests/blockfault (stderr) none/tests/mremap2 (stdout) helgrind/tests/tc08_hbl2 (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 == 443 tests, 8 stderr failures, 1 stdout failure, 0 post failures == memcheck/tests/file_locking (stderr) memcheck/tests/malloc_free_fill (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/x86/scalar (stderr) none/tests/blockfault (stderr) none/tests/mremap2 (stdout) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc21_pthonce (stderr) helgrind/tests/tc22_exit_w_lock (stderr) ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short Thu Aug 28 03:37:19 2008 --- new.short Thu Aug 28 03:54:39 2008 *************** *** 8,10 **** ! == 443 tests, 8 stderr failures, 1 stdout failure, 0 post failures == memcheck/tests/file_locking (stderr) --- 8,10 ---- ! == 444 tests, 8 stderr failures, 2 stdout failures, 0 post failures == memcheck/tests/file_locking (stderr) *************** *** 15,16 **** --- 15,17 ---- none/tests/mremap2 (stdout) + helgrind/tests/tc08_hbl2 (stdout) helgrind/tests/tc20_verifywrap (stderr) |
|
From: Tom H. <th...@cy...> - 2008-08-28 02:44:46
|
Nightly build on lloyd ( x86_64, Fedora 7 ) started at 2008-08-28 03:05:09 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 == 438 tests, 6 stderr failures, 2 stdout failures, 0 post failures == memcheck/tests/file_locking (stderr) memcheck/tests/malloc_free_fill (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/vcpu_fnfns (stdout) memcheck/tests/x86/scalar (stderr) none/tests/mremap2 (stdout) helgrind/tests/tc20_verifywrap (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 == 437 tests, 6 stderr failures, 2 stdout failures, 0 post failures == memcheck/tests/file_locking (stderr) memcheck/tests/malloc_free_fill (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/vcpu_fnfns (stdout) memcheck/tests/x86/scalar (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 Thu Aug 28 03:21:30 2008 --- new.short Thu Aug 28 03:44:52 2008 *************** *** 8,10 **** ! == 437 tests, 6 stderr failures, 2 stdout failures, 0 post failures == memcheck/tests/file_locking (stderr) --- 8,10 ---- ! == 438 tests, 6 stderr failures, 2 stdout failures, 0 post failures == memcheck/tests/file_locking (stderr) |
|
From: Tom H. <th...@cy...> - 2008-08-28 02:42:00
|
Nightly build on trojan ( x86_64, Fedora Core 6 ) started at 2008-08-28 03:25:04 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 == 442 tests, 8 stderr failures, 5 stdout failures, 0 post failures == memcheck/tests/file_locking (stderr) memcheck/tests/malloc_free_fill (stderr) 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/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 == 441 tests, 8 stderr failures, 5 stdout failures, 0 post failures == memcheck/tests/file_locking (stderr) memcheck/tests/malloc_free_fill (stderr) 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/mremap2 (stdout) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc21_pthonce (stderr) helgrind/tests/tc22_exit_w_lock (stderr) ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short Thu Aug 28 03:33:30 2008 --- new.short Thu Aug 28 03:42:07 2008 *************** *** 8,10 **** ! == 441 tests, 8 stderr failures, 5 stdout failures, 0 post failures == memcheck/tests/file_locking (stderr) --- 8,10 ---- ! == 442 tests, 8 stderr failures, 5 stdout failures, 0 post failures == memcheck/tests/file_locking (stderr) |
|
From: Evan G. <th...@gm...> - 2008-08-28 02:39:05
|
My port is nearly done, minus floating point and VFP and neon and some other stuff, but it runs plenty of stuff just fine. Yes memcheck works fine too. Please don't start a port now :) It'd be a shame to have two separate ARM ports. And for the record it's a huge amount of work. Ivan's code isn't working either, since the flags aren't being set properly, and removing the flag thunks slows things down. Currently the flags are being calculated in IR but I plan to make that a helper. The tree is pretty dirty right now, I might just post a tarball somewhere so people can play with it. I haven't really talked to anyone from the valgrind project about actually integrating it in. The code is just really hashy right now, but it works. I'll try and have it up by next friday :-D /eazg ~~~~ Hi all: We are also trying to port Valgrind to ARM. We are not sure whether we shall proceed because right now we have no idea how much time it is going to take. I've read the following Documentation: 1) Valgrind: A Framework for Heavyweight Dynamic Binary Instrumentation; 2) How to Shadow Every Byte of Memory Used by a Program; Here's my understanding and questions about porting Valgrind to ARM. Please correct me if I am wrong: How Valgrind works: Valgrind core will first convert the user executable into a standard Valgrind intermediate code (somewhat similar to the JAVA byte code). After that, Valgrind will do some optimization on the intermediate code. Then the Valgrind tools such as memcheck will instrument (massage) the intermediate code to implement the tools' own functionality, e.g., memory leak detection. Since this step is based on intermediate code (architecture independent), theoretically, we don't need to do extra work on Valgrind tools. When Valgrind tools finish massaging the intermediate code, Valgrind core will optimize the intermediate code again, allocate architecture dependant registers, and then convert the optimized intermediate code back to the architecture specific machine code (ARM binary code). To port Valgrind to ARM, we need to do the following: a) Convert ARM executable to IR code. This part is already available inVEX/priv/guest-arm/toIR.c and Ivan has the path for it. This is the client's side. b) Convert the optimized Valgrind intermediate code back to the ARM binary executable. There's a lot of work to do here inVEX/priv/host-arm/hdefs.c. Basically we have to implement corresponding functions for ARM as listed in vex_main.c for PPC32: case VexArchPPC32: mode64 = False; getAllocableRegs_PPC ( &n_available_real_regs,&available_real_regs, mode64 ); isMove = (Bool(*)(HInstr*,HReg*,HReg*)) isMove_PPCInstr; getRegUsage = (void(*)(HRegUsage*,HInstr*,Bool))getRegUsage_PPCInstr; mapRegs = (void(*)(HRegRemap*,HInstr*,Bool)) mapRegs_PPCInstr; genSpill = (HInstr*(*)(HReg,Int,Bool)) genSpill_PPC; genReload = (HInstr*(*)(HReg,Int,Bool)) genReload_PPC; ppInstr = (void(*)(HInstr*,Bool)) ppPPCInstr; ppReg = (void(*)(HReg)) ppHRegPPC;iselSB = iselSB_PPC; emit = (Int(*)(UChar*,Int,HInstr*,Bool,void*))emit_PPCInstr; host_is_bigendian = True; host_word_type = Ity_I32; vassert(are_valid_hwcaps(VexArchPPC32, vta->archinfo_host.hwcaps)); vassert(vta->dispatch == NULL); /* return-to-dispatcher scheme */ break; Of course we need to implement other functions such as scheduler, dispatcher, c_main startup code, etc..., but the above mentioned two parts are the key steps to the porting. My biggest concern is that according to my understanding, porting to ARM does not require extra work on memcheck, callgrind, helgrind and other Valgrind tools since these tools work on Valgrind IR code and the IR code is architecture independent. Can anyone tell me whether the porting requires extra work on Valgrind tools? Thanks Shachen _________________________________________________________________ ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ Valgrind-developers mailing list Val...@li...<mailto: Val...@li...> https://lists.sourceforge.net/lists/listinfo/valgrind-developers -- --- Evan Geller th...@gm... -- --- Evan Geller th...@gm... |
|
From: Tom H. <th...@cy...> - 2008-08-28 02:24:02
|
Nightly build on gill ( x86_64, Fedora Core 2 ) started at 2008-08-28 03:00: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 == 444 tests, 31 stderr failures, 3 stdout failures, 0 post failures == memcheck/tests/file_locking (stderr) memcheck/tests/malloc_free_fill (stderr) memcheck/tests/origin5-bz2 (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/stack_switch (stderr) memcheck/tests/varinfo6 (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/x86/scalar_supp (stderr) none/tests/amd64/insn_ssse3 (stdout) none/tests/amd64/insn_ssse3 (stderr) none/tests/amd64/ssse3_misaligned (stderr) none/tests/blockfault (stderr) none/tests/fdleak_fcntl (stderr) none/tests/mremap2 (stdout) none/tests/x86/insn_ssse3 (stdout) none/tests/x86/insn_ssse3 (stderr) none/tests/x86/ssse3_misaligned (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/tc01_simple_race (stderr) helgrind/tests/tc05_simple_race (stderr) helgrind/tests/tc06_two_races (stderr) helgrind/tests/tc09_bad_unlock (stderr) helgrind/tests/tc14_laog_dinphils (stderr) helgrind/tests/tc16_byterace (stderr) helgrind/tests/tc17_sembar (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) ================================================= == 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 == 443 tests, 31 stderr failures, 3 stdout failures, 0 post failures == memcheck/tests/file_locking (stderr) memcheck/tests/malloc_free_fill (stderr) memcheck/tests/origin5-bz2 (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/stack_switch (stderr) memcheck/tests/varinfo6 (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/x86/scalar_supp (stderr) none/tests/amd64/insn_ssse3 (stdout) none/tests/amd64/insn_ssse3 (stderr) none/tests/amd64/ssse3_misaligned (stderr) none/tests/blockfault (stderr) none/tests/fdleak_fcntl (stderr) none/tests/mremap2 (stdout) none/tests/x86/insn_ssse3 (stdout) none/tests/x86/insn_ssse3 (stderr) none/tests/x86/ssse3_misaligned (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/tc01_simple_race (stderr) helgrind/tests/tc05_simple_race (stderr) helgrind/tests/tc06_two_races (stderr) helgrind/tests/tc09_bad_unlock (stderr) helgrind/tests/tc14_laog_dinphils (stderr) helgrind/tests/tc16_byterace (stderr) helgrind/tests/tc17_sembar (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) ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short Thu Aug 28 03:11:59 2008 --- new.short Thu Aug 28 03:24:07 2008 *************** *** 8,10 **** ! == 443 tests, 31 stderr failures, 3 stdout failures, 0 post failures == memcheck/tests/file_locking (stderr) --- 8,10 ---- ! == 444 tests, 31 stderr failures, 3 stdout failures, 0 post failures == memcheck/tests/file_locking (stderr) |