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-22 23:17:54
|
Author: sewardj
Date: 2008-08-23 00:18:02 +0100 (Sat, 23 Aug 2008)
New Revision: 8540
Log:
Rework storage management in the Dwarf3 type and variable reader, to
try and reduce its space consumption. This change changes some long
linked lists into XArrays instead.
Modified:
trunk/coregrind/m_debuginfo/debuginfo.c
trunk/coregrind/m_debuginfo/priv_d3basics.h
trunk/coregrind/m_debuginfo/priv_storage.h
trunk/coregrind/m_debuginfo/priv_tytypes.h
trunk/coregrind/m_debuginfo/readdwarf3.c
trunk/coregrind/m_debuginfo/tytypes.c
Modified: trunk/coregrind/m_debuginfo/debuginfo.c
===================================================================
--- trunk/coregrind/m_debuginfo/debuginfo.c 2008-08-22 23:16:06 UTC (rev 8539)
+++ trunk/coregrind/m_debuginfo/debuginfo.c 2008-08-22 23:18:02 UTC (rev 8540)
@@ -192,10 +192,10 @@
/* Free a DebugInfo, and also all the stuff hanging off it. */
static void free_DebugInfo ( DebugInfo* di )
{
- Word i, j;
+ Word i, j, n;
struct strchunk *chunk, *next;
- TyAdmin *admin1, *admin2;
- GExpr *gexpr1, *gexpr2;
+ TyAdmin* admin;
+ GExpr* gexpr;
vg_assert(di != NULL);
if (di->filename) ML_(dinfo_free)(di->filename);
@@ -212,13 +212,24 @@
/* Delete the two admin lists. These lists exist purely so that we
can visit each object exactly once when we need to delete
them. */
- for (admin1 = di->admin_tyadmins; admin1; admin1 = admin2) {
- admin2 = admin1->next;
- ML_(delete_TyAdmin_and_payload)(admin1);
+ if (di->admin_tyadmins) {
+ n = VG_(sizeXA)(di->admin_tyadmins);
+ for (i = 0; i < n; i++) {
+ admin = (TyAdmin*)VG_(indexXA)(di->admin_tyadmins, i);
+ ML_(delete_payload_of_TyAdmin)(admin);
+ }
+ VG_(deleteXA)(di->admin_tyadmins);
+ di->admin_tyadmins = NULL;
}
- for (gexpr1 = di->admin_gexprs; gexpr1; gexpr1 = gexpr2) {
- gexpr2 = gexpr1->next;
- ML_(dinfo_free)(gexpr1);
+
+ if (di->admin_gexprs) {
+ n = VG_(sizeXA)(di->admin_gexprs);
+ for (i = 0; i < n; i++) {
+ gexpr = *(GExpr**)VG_(indexXA)(di->admin_gexprs, i);
+ ML_(dinfo_free)(gexpr);
+ }
+ VG_(deleteXA)(di->admin_gexprs);
+ di->admin_gexprs = NULL;
}
/* Dump the variable info. This is kinda complex: we must take
Modified: trunk/coregrind/m_debuginfo/priv_d3basics.h
===================================================================
--- trunk/coregrind/m_debuginfo/priv_d3basics.h 2008-08-22 23:16:06 UTC (rev 8539)
+++ trunk/coregrind/m_debuginfo/priv_d3basics.h 2008-08-22 23:18:02 UTC (rev 8540)
@@ -577,7 +577,6 @@
*/
typedef
struct _GExpr {
- struct _GExpr* next;
UChar payload[0];
}
GExpr;
Modified: trunk/coregrind/m_debuginfo/priv_storage.h
===================================================================
--- trunk/coregrind/m_debuginfo/priv_storage.h 2008-08-22 23:16:06 UTC (rev 8539)
+++ trunk/coregrind/m_debuginfo/priv_storage.h 2008-08-22 23:18:02 UTC (rev 8540)
@@ -403,9 +403,9 @@
expressly for the purposes of visiting each object exactly once
when we need to delete them. */
- /* A list of TyAdmin structs, and the payloads that they refer
+ /* An array of TyAdmin structs, and the payloads that they refer
to. */
- TyAdmin* admin_tyadmins;
+ XArray* /* of TyAdmin */ admin_tyadmins;
/* A list of guarded DWARF3 expressions. */
GExpr* admin_gexprs;
Modified: trunk/coregrind/m_debuginfo/priv_tytypes.h
===================================================================
--- trunk/coregrind/m_debuginfo/priv_tytypes.h 2008-08-22 23:16:06 UTC (rev 8539)
+++ trunk/coregrind/m_debuginfo/priv_tytypes.h 2008-08-22 23:18:02 UTC (rev 8540)
@@ -52,7 +52,6 @@
struct _TyAdmin {
UWord cuOff;
void* payload;
- TyAdmin* next;
TyAdminTag tag;
};
@@ -128,14 +127,16 @@
} Ty;
};
-TyAdmin* ML_(new_TyAdmin) ( UWord cuOff, TyAdmin* next );
+TyAdmin* ML_(new_TyAdmin) ( UWord cuOff );
TyAtom* ML_(new_TyAtom) ( UChar* name, Long value );
TyField* ML_(new_TyField) ( UChar* name, Type* typeR, D3Expr* loc );
TyBounds* ML_(new_TyBounds) ( void );
Type* ML_(new_Type) ( void );
D3Expr* ML_(new_D3Expr) ( UChar* bytes, UWord nbytes );
-void ML_(delete_TyAdmin_and_payload) ( TyAdmin* ad );
+/* Delete the payload attached to this TyAdmin, but not the TyAdmin
+ itself. */
+void ML_(delete_payload_of_TyAdmin) ( TyAdmin* );
void ML_(pp_TyAdmin) ( TyAdmin* admin );
void ML_(pp_TyAtom) ( TyAtom* atom );
Modified: trunk/coregrind/m_debuginfo/readdwarf3.c
===================================================================
--- trunk/coregrind/m_debuginfo/readdwarf3.c 2008-08-22 23:16:06 UTC (rev 8539)
+++ trunk/coregrind/m_debuginfo/readdwarf3.c 2008-08-22 23:18:02 UTC (rev 8540)
@@ -630,7 +630,6 @@
vg_assert( &gx->payload[bytesReqd]
== ((UChar*)gx) + sizeof(GExpr) + bytesReqd );
- gx->next = NULL;
return gx;
}
@@ -737,8 +736,6 @@
VG_(deleteXA)( xa );
- gx->next = NULL;
-
TRACE_D3("}\n");
return gx;
@@ -1134,7 +1131,6 @@
typedef
struct _TempVar {
- struct _TempVar* next;
UChar* name; /* in DebugInfo's .strchunks */
/* Represent ranges economically. nRanges is the number of
ranges. Cases:
@@ -1387,8 +1383,8 @@
__attribute__((noinline))
-static void parse_var_DIE ( /*OUT*/TempVar** tempvars,
- /*OUT*/GExpr** gexprs,
+static void parse_var_DIE ( /*MOD*/XArray* /* of TempVar* */ tempvars,
+ /*MOD*/XArray* /* of GExpr* */ gexprs,
/*MOD*/D3VarParser* parser,
DW_TAG dtag,
UWord posn,
@@ -1545,9 +1541,7 @@
|| (ctsMemSzB == 0 && ctsSzB > 0))) {
fbGX = get_GX( cc, False/*td3*/, cts, ctsSzB, ctsMemSzB );
vg_assert(fbGX);
- vg_assert(!fbGX->next);
- fbGX->next = *gexprs;
- *gexprs = fbGX;
+ VG_(addToXA)(gexprs, &fbGX);
}
}
/* Do we have something that looks sane? */
@@ -1621,9 +1615,7 @@
|| (ctsMemSzB == 0 && ctsSzB > 0))) {
gexpr = get_GX( cc, False/*td3*/, cts, ctsSzB, ctsMemSzB );
vg_assert(gexpr);
- vg_assert(!gexpr->next);
- gexpr->next = *gexprs;
- *gexprs = gexpr;
+ VG_(addToXA)(gexprs, &gexpr);
}
if (attr == DW_AT_type && ctsSzB > 0) {
typeR = (Type*)(UWord)cts;
@@ -1748,8 +1740,7 @@
tv->rngMany = VG_(cloneXA)( xa ); /* free when 'tv' freed */
}
- tv->next = *tempvars;
- *tempvars = tv;
+ VG_(addToXA)( tempvars, &tv );
TRACE_D3(" Recording this variable, with %ld PC range(s)\n",
VG_(sizeXA)(xa) );
@@ -1963,7 +1954,7 @@
it.
*/
__attribute__((noinline))
-static void parse_type_DIE ( /*OUT*/TyAdmin** admin,
+static void parse_type_DIE ( /*MOD*/XArray* /* of TyAdmin */ admin,
/*MOD*/D3TypeParser* parser,
DW_TAG dtag,
UWord posn,
@@ -1981,6 +1972,7 @@
TyField* field = NULL;
D3Expr* expr = NULL;
TyBounds* bounds = NULL;
+ TyAdmin tyad;
UWord saved_die_c_offset = get_position_of_Cursor( c_die );
UWord saved_abbv_c_offset = get_position_of_Cursor( c_abbv );
@@ -2488,9 +2480,11 @@
if (0) VG_(printf)("YYYY Acquire Type\n");
vg_assert(type); vg_assert(!atom); vg_assert(!field);
vg_assert(!expr); vg_assert(!bounds);
- *admin = ML_(new_TyAdmin)( posn, *admin );
- (*admin)->payload = type;
- (*admin)->tag = TyA_Type;
+ VG_(memset)( &tyad, 0, sizeof(tyad) );
+ tyad.cuOff = posn;
+ tyad.payload = type;
+ tyad.tag = TyA_Type;
+ VG_(addToXA)( admin, &tyad );
return;
/*NOTREACHED*/
@@ -2498,9 +2492,11 @@
if (0) VG_(printf)("YYYY Acquire Atom\n");
vg_assert(!type); vg_assert(atom); vg_assert(!field);
vg_assert(!expr); vg_assert(!bounds);
- *admin = ML_(new_TyAdmin)( posn, *admin );
- (*admin)->payload = atom;
- (*admin)->tag = TyA_Atom;
+ VG_(memset)( &tyad, 0, sizeof(tyad) );
+ tyad.cuOff = posn;
+ tyad.payload = atom;
+ tyad.tag = TyA_Atom;
+ VG_(addToXA)( admin, &tyad );
return;
/*NOTREACHED*/
@@ -2510,14 +2506,17 @@
vg_assert(!type); vg_assert(!atom); vg_assert(field);
/*vg_assert(expr);*/ vg_assert(!bounds);
if (expr) {
- *admin = ML_(new_TyAdmin)( (UWord)D3_INVALID_CUOFF,
- *admin );
- (*admin)->payload = expr;
- (*admin)->tag = TyA_Expr;
+ VG_(memset)( &tyad, 0, sizeof(tyad) );
+ tyad.cuOff = (UWord)D3_INVALID_CUOFF;
+ tyad.payload = expr;
+ tyad.tag = TyA_Expr;
+ VG_(addToXA)( admin, &tyad );
}
- *admin = ML_(new_TyAdmin)( posn, *admin );
- (*admin)->payload = field;
- (*admin)->tag = TyA_Field;
+ VG_(memset)( &tyad, 0, sizeof(tyad) );
+ tyad.cuOff = posn;
+ tyad.payload = field;
+ tyad.tag = TyA_Field;
+ VG_(addToXA)( admin, &tyad );
return;
/*NOTREACHED*/
@@ -2525,9 +2524,11 @@
if (0) VG_(printf)("YYYY Acquire Bounds\n");
vg_assert(!type); vg_assert(!atom); vg_assert(!field);
vg_assert(!expr); vg_assert(bounds);
- *admin = ML_(new_TyAdmin)( posn, *admin );
- (*admin)->payload = bounds;
- (*admin)->tag = TyA_Bounds;
+ VG_(memset)( &tyad, 0, sizeof(tyad) );
+ tyad.cuOff = posn;
+ tyad.payload = bounds;
+ tyad.tag = TyA_Bounds;
+ VG_(addToXA)( admin, &tyad );
return;
/*NOTREACHED*/
@@ -2559,84 +2560,109 @@
/*------------------------------------------------------------*/
static Int cmp_D3TyAdmin_by_cuOff ( void* v1, void* v2 ) {
- TyAdmin* a1 = *(TyAdmin**)v1;
- TyAdmin* a2 = *(TyAdmin**)v2;
+ TyAdmin* a1 = (TyAdmin*)v1;
+ TyAdmin* a2 = (TyAdmin*)v2;
if (a1->cuOff < a2->cuOff) return -1;
if (a1->cuOff > a2->cuOff) return 1;
return 0;
}
-/* Look up 'cuOff' in 'map', to find the associated D3TyAdmin*. Check
- that the found D3TyAdmin has tag 'adtag'. Sets *payload to be the
- resulting payload pointer and returns True on success.
+/* Look up 'cuOff' in 'admin', to find the associated D3TyAdmin.
+ Check that the found D3TyAdmin has tag 'adtag'. Sets *payload to
+ be the resulting payload pointer and returns True on success.
Also, if 'allow_invalid' is True, then if cuOff is
D3_INVALID_CUOFF, return NULL in *payload.
- Otherwise (conceptually fails) and returns False. */
+ Otherwise (conceptually fails) and returns False.
+
+ Note that 'admin' has previously been sorted on its .cuOff fields,
+ so we can legitimately look up using them.
+ */
__attribute__((noinline))
static Bool resolve_binding ( /*OUT*/void** payload,
- XArray* map, void* cuOff,
+ XArray* /* of TyAdmin */ admin,
+ void* cuOff,
TyAdminTag tag,
Bool allow_invalid ) {
Bool found;
Word ixLo, ixHi;
- TyAdmin dummy, *dummyP, *admin;
+ TyAdmin dummy, *tyad;
- if (cuOff == D3_INVALID_CUOFF && allow_invalid) {
- *payload = NULL;
- return True;
+ if (cuOff == D3_INVALID_CUOFF) {
+ if (allow_invalid) {
+ *payload = NULL;
+ return True;
+ } else {
+ return False;
+ }
}
+ /* Hence ... */
+ tl_assert(cuOff != D3_INVALID_CUOFF);
+
VG_(memset)(&dummy, 0, sizeof(dummy));
dummy.cuOff = (UWord)cuOff;
- dummyP = &dummy;
- found = VG_(lookupXA)( map, &dummyP, &ixLo, &ixHi );
+ found = VG_(lookupXA)( admin, &dummy, &ixLo, &ixHi );
if (!found)
return False;
/* If this doesn't hold, we must have seen more than one DIE with
the same cuOff(set). Which isn't possible. */
vg_assert(ixLo == ixHi);
- admin = *(TyAdmin**)VG_(indexXA)( map, ixLo );
+ tyad = (TyAdmin*)VG_(indexXA)( admin, ixLo );
/* All payload pointers should be non-NULL. Ensured by assertion in
loop in resolve_type_entities that creates 'map'. Hence it is
safe to return NULL to indicate 'not found'. */
- vg_assert(admin->payload);
- vg_assert(admin->cuOff == (UWord)cuOff); /* stay sane */
+ vg_assert(tyad->payload);
+ vg_assert(tyad->cuOff == (UWord)cuOff); /* stay sane */
- if (admin->tag != tag)
+ if (tyad->tag != tag)
return False;
- *payload = admin->payload;
+ *payload = tyad->payload;
return True;
}
+
+/* First, we sort the 'admin' array by its .cuOff fields. That means
+ we can now hand it to resolve_binding() above, which simply looks
+ up the payload associated with a given cuOff value by doing a
+ binary search in 'admin'.
+
+ There is a subtlety that some of the .cuOff fields in 'admin' are
+ D3_INVALID_CUOFF, and we don't want anybody to be able to look up
+ anything against that value. Rather than filter those out, we
+ leave them in, sort as usual, but arrange so that resolve_binding()
+ never looks up a D3_INVALID_CUOFF value.
+
+ Having done the sorting, we then work through the payload fields of
+ 'admin' and convert all cuOff values into real pointers, by looking
+ them up using resolve_binding(). That's the whole purpose of this
+ resolution mechanism. We also resolve the type expressions on the
+ supplied 'vars' array. */
+
__attribute__((noinline))
-static void resolve_type_entities ( /*MOD*/TyAdmin* admin,
- /*MOD*/TempVar* vars )
+static void resolve_type_entities ( /*MOD*/XArray* /* of TyAdmin */ admin,
+ /*MOD*/XArray* /* of TempVar* */ vars )
{
Bool ok;
+ Word i, n;
void* payload;
TyAdmin* adp;
- XArray* /* of D3TyAdmin* */ map;
- map = VG_(newXA)( ML_(dinfo_zalloc), ML_(dinfo_free),
- sizeof(TyAdmin*) );
- for (adp = admin; adp; adp = adp->next) {
- vg_assert(adp);
- vg_assert(adp->payload != NULL);
- if (adp->cuOff != (UWord)D3_INVALID_CUOFF) {
- VG_(addToXA)( map, &adp );
- }
- }
+ tl_assert(admin);
- VG_(setCmpFnXA)( map, cmp_D3TyAdmin_by_cuOff );
+ n = VG_(sizeXA)( admin );
+
+ VG_(setCmpFnXA)( admin, cmp_D3TyAdmin_by_cuOff );
if (0)
VG_(printf)("XXXXXX sorting map with %d entries\n",
- (Int)VG_(sizeXA)(map));
- VG_(sortXA)( map );
+ (Int)VG_(sizeXA)(admin));
+ VG_(sortXA)( admin );
- for (adp = admin; adp; adp = adp->next) {
+ for (i = 0; i < n; i++) {
+ adp = (TyAdmin*)VG_(indexXA)( admin, i );
+ vg_assert(adp);
vg_assert(adp->payload);
switch (adp->tag) {
case TyA_Bounds: {
@@ -2661,7 +2687,7 @@
if ( (field->isStruct && (!field->loc))
|| ((!field->isStruct) && field->loc))
goto baaad;
- ok = resolve_binding( &payload, map, field->typeR,
+ ok = resolve_binding( &payload, admin, field->typeR,
TyA_Type, False/*!allow_invalid*/ );
if (!ok) goto baaad;
field->typeR = payload;
@@ -2681,7 +2707,7 @@
break;
case Ty_TyDef:
if (!ty->Ty.TyDef.name) goto baaad;
- ok = resolve_binding( &payload, map,
+ ok = resolve_binding( &payload, admin,
ty->Ty.TyDef.typeR,
TyA_Type,
True/*allow_invalid*/ );
@@ -2690,7 +2716,7 @@
break;
case Ty_PorR:
if (ty->Ty.PorR.szB != sizeof(Word)) goto baaad;
- ok = resolve_binding( &payload, map,
+ ok = resolve_binding( &payload, admin,
ty->Ty.PorR.typeR,
TyA_Type,
False/*!allow_invalid*/ );
@@ -2699,7 +2725,7 @@
break;
case Ty_Array:
if (!ty->Ty.Array.bounds) goto baaad;
- ok = resolve_binding( &payload, map,
+ ok = resolve_binding( &payload, admin,
ty->Ty.Array.typeR,
TyA_Type,
False/*!allow_invalid*/ );
@@ -2721,7 +2747,7 @@
case Ty_Qual:
if (ty->Ty.Qual.qual != 'C'
&& ty->Ty.Qual.qual != 'V') goto baaad;
- ok = resolve_binding( &payload, map,
+ ok = resolve_binding( &payload, admin,
ty->Ty.Qual.typeR,
TyA_Type,
False/*!allow_invalid*/ );
@@ -2746,19 +2772,19 @@
}
/* Now resolve the variables list */
- for (; vars; vars = vars->next) {
+ n = VG_(sizeXA)( vars );
+ for (i = 0; i < n; i++) {
+ TempVar* var = *(TempVar**)VG_(indexXA)( vars, i );
payload = NULL;
- ok = resolve_binding( &payload, map, vars->typeR,
+ ok = resolve_binding( &payload, admin, var->typeR,
TyA_Type, True/*allow_invalid*/ );
if (0 && !ok)
VG_(printf)("Can't resolve type reference 0x%lx\n",
- (UWord)vars->typeR);
+ (UWord)var->typeR);
//vg_assert(ok);
- vars->typeR = payload;
+ var->typeR = payload;
}
-
- VG_(deleteXA)( map );
}
@@ -2776,9 +2802,9 @@
return 0;
}
-static void read_DIE ( /*OUT*/TyAdmin** admin,
- /*OUT*/TempVar** tempvars,
- /*OUT*/GExpr** gexprs,
+static void read_DIE ( /*MOD*/XArray* /* of TyAdmin */ admin,
+ /*OUT*/XArray* /* of TempVar* */ tempvars,
+ /*MOD*/XArray* /* of GExpr* */ gexprs,
/*MOD*/D3TypeParser* typarser,
/*MOD*/D3VarParser* varparser,
Cursor* c, Bool td3, CUConst* cc, Int level )
@@ -2895,9 +2921,11 @@
UChar* debug_loc_img, SizeT debug_loc_sz
)
{
- TyAdmin *admin, *adminp;
- TempVar *tempvars, *varp, *varp2;
- GExpr *gexprs, *gexpr;
+ XArray* /* of TyAdmin */ admin;
+ XArray* /* of GExpr* */ gexprs;
+ XArray* /* of TempVar* */ tempvars;
+ TempVar *varp, *varp2;
+ GExpr* gexpr;
Cursor abbv; /* for showing .debug_abbrev */
Cursor info; /* primary cursor for parsing .debug_info */
Cursor ranges; /* for showing .debug_ranges */
@@ -2905,7 +2933,7 @@
D3VarParser varparser;
Addr dr_base;
UWord dr_offset;
- Word i;
+ Word i, j, n;
Bool td3 = di->trace_symtab;
XArray* /* of TempVar* */ dioff_lookup_tab;
Bool text_biasing_borked;
@@ -3013,7 +3041,6 @@
dr_offset, w1 + dr_base, w2 + dr_base);
}
-
/* Display .debug_abbrev */
init_Cursor( &abbv, debug_abbv_img, debug_abbv_sz, 0, barf,
"Overrun whilst reading .debug_abbrev section" );
@@ -3058,23 +3085,27 @@
huge and presumably will not occur in any valid DWARF3 file --
it would need to have a .debug_info section 4GB long for that to
happen. These type entries end up in the DebugInfo. */
- admin = NULL;
- { Type* tVoid = ML_(new_Type)();
+ admin = VG_(newXA)( ML_(dinfo_zalloc), ML_(dinfo_free), sizeof(TyAdmin) );
+ { TyAdmin tyad;
+ Type* tVoid = ML_(new_Type)();
tVoid->tag = Ty_Void;
tVoid->Ty.Void.isFake = True;
- admin = ML_(new_TyAdmin)( (UWord)D3_FAKEVOID_CUOFF, admin );
- admin->payload = tVoid;
- admin->tag = TyA_Type;
+ VG_(memset)( &tyad, 0, sizeof(tyad) );
+ tyad.cuOff = (UWord)D3_FAKEVOID_CUOFF;
+ tyad.payload = tVoid;
+ tyad.tag = TyA_Type;
+ VG_(addToXA)( admin, &tyad );
}
/* List of variables we're accumulating. These don't end up in the
DebugInfo; instead their contents are handed to ML_(addVar) and
the list elements are then deleted. */
- tempvars = NULL;
+ tempvars = VG_(newXA)( ML_(dinfo_zalloc), ML_(dinfo_free),
+ sizeof(TempVar*) );
/* List of GExprs we're accumulating. These wind up in the
DebugInfo. */
- gexprs = NULL;
+ gexprs = VG_(newXA)( ML_(dinfo_zalloc), ML_(dinfo_free), sizeof(GExpr*) );
/* We need a D3TypeParser to keep track of partially constructed
types. It'll be discarded as soon as we've completed the CU,
@@ -3162,7 +3193,7 @@
/* Now read the one-and-only top-level DIE for this CU. */
vg_assert(varparser.sp == 0);
- read_DIE( &admin, &tempvars, &gexprs, &typarser, &varparser,
+ read_DIE( admin, tempvars, gexprs, &typarser, &varparser,
&info, td3, &cc, 0 );
cu_offset_now = get_position_of_Cursor( &info );
@@ -3191,40 +3222,22 @@
varparser.filenameTable = NULL;
}
- /* Put the type entry list the right way round. Not strictly
- necessary, but makes it easier to read. */
- vg_assert(admin);
- if (admin) {
- TyAdmin *next, *prev = NULL;
- for (adminp = admin; adminp; adminp = next) {
- next = adminp->next;
- adminp->next = prev;
- prev = adminp;
- }
- admin = prev;
- }
+ /* From here on we're post-processing the stuff we got
+ out of the .debug_info section. */
- /* Put the variable list the right way round. Not strictly
- necessary, but makes it easier to read. */
- if (tempvars) {
- TempVar *next, *prev = NULL;
- for (varp = tempvars; varp; varp = next) {
- next = varp->next;
- varp->next = prev;
- prev = varp;
+ if (td3) {
+ TRACE_D3("\n");
+ TRACE_D3("------ Acquired the following type entities: ------\n");
+ n = VG_(sizeXA)( admin );
+ for (i = 0; i < n; i++) {
+ TyAdmin* tyad = (TyAdmin*)VG_(indexXA)( admin, i );
+ TRACE_D3(" ");
+ ML_(pp_TyAdmin)( tyad );
+ TRACE_D3("\n");
}
- tempvars = prev;
- }
-
- TRACE_D3("\n");
- TRACE_D3("------ Acquired the following type entities: ------\n");
- for (adminp = admin; adminp; adminp = adminp->next) {
- TRACE_D3(" ");
- if (td3) ML_(pp_TyAdmin)( adminp );
TRACE_D3("\n");
+ TRACE_D3("------ Resolving type entries ------\n");
}
- TRACE_D3("\n");
- TRACE_D3("------ Resolving type entries ------\n");
/* See "Comment_Regarding_DWARF3_Text_Biasing" above. */
VG_(memset)( &ktb, 0, sizeof(ktb ));
@@ -3233,7 +3246,9 @@
ktb.text_bias = di->text_bias;
resolve_type_entities( admin, tempvars );
- for (gexpr = gexprs; gexpr; gexpr = gexpr->next) {
+ n = VG_(sizeXA)( gexprs );
+ for (i = 0; i < n; i++) {
+ gexpr = *(GExpr**)VG_(indexXA)( gexprs, i );
bias_GX( gexpr, &ktb );
}
@@ -3242,26 +3257,35 @@
/* Park (pointers to) all the vars in an XArray, so we can look up
abstract origins quickly. The array is sorted (hence, looked-up
- by) the .dioff fields. Since the .dioffs should be instrictly
+ by) the .dioff fields. Since the .dioffs should be in strictly
ascending order, there is no need to sort the array after
construction. The ascendingness is however asserted for. */
dioff_lookup_tab
= VG_(newXA)( ML_(dinfo_zalloc), ML_(dinfo_free),
sizeof(TempVar*) );
vg_assert(dioff_lookup_tab);
- varp2 = NULL;
- for (varp = tempvars; varp; varp = varp->next) {
- if (varp2)
+
+ n = VG_(sizeXA)( tempvars );
+ for (i = 0; i < n; i++) {
+ varp = *(TempVar**)VG_(indexXA)( tempvars, i );
+ if (i > 0) {
+ varp2 = *(TempVar**)VG_(indexXA)( tempvars, i-1 );
+ /* why should this hold? Only, I think, because we've
+ constructed the array by reading .debug_info sequentially,
+ and so the array .dioff fields should reflect that, and be
+ strictly ascending. */
vg_assert(varp2->dioff < varp->dioff);
+ }
VG_(addToXA)( dioff_lookup_tab, &varp );
- varp2 = varp;
}
VG_(setCmpFnXA)( dioff_lookup_tab, cmp_TempVar_by_dioff );
VG_(sortXA)( dioff_lookup_tab ); /* POINTLESS; FIXME: rm */
/* Now visit each var. Collect up as much info as possible for
each var and hand it to ML_(addVar). */
- for (varp = tempvars; varp; varp = varp->next) {
+ n = VG_(sizeXA)( tempvars );
+ for (j = 0; j < n; j++) {
+ varp = *(TempVar**)VG_(indexXA)( tempvars, j );
/* Possibly show .. */
if (td3) {
@@ -3448,12 +3472,14 @@
barf("couldn't make sense of DWARF3 text-svma biasing; details above");
/* Now free all the TempVars */
- for (varp = tempvars; varp; varp = varp2) {
- varp2 = varp->next;
+ n = VG_(sizeXA)( tempvars );
+ for (i = 0; i < n; i++) {
+ varp = *(TempVar**)VG_(indexXA)( tempvars, i );
if (varp->rngMany)
VG_(deleteXA)(varp->rngMany);
ML_(dinfo_free)(varp);
}
+ VG_(deleteXA)( tempvars );
tempvars = NULL;
/* And get rid of the temporary mapping table. */
Modified: trunk/coregrind/m_debuginfo/tytypes.c
===================================================================
--- trunk/coregrind/m_debuginfo/tytypes.c 2008-08-22 23:16:06 UTC (rev 8539)
+++ trunk/coregrind/m_debuginfo/tytypes.c 2008-08-22 23:18:02 UTC (rev 8540)
@@ -44,10 +44,9 @@
#include "priv_tytypes.h" /* self */
-TyAdmin* ML_(new_TyAdmin) ( UWord cuOff, TyAdmin* next ) {
+TyAdmin* ML_(new_TyAdmin) ( UWord cuOff ) {
TyAdmin* admin = ML_(dinfo_zalloc)( sizeof(TyAdmin) );
admin->cuOff = cuOff;
- admin->next = next;
return admin;
}
TyAtom* ML_(new_TyAtom) ( UChar* name, Long value ) {
@@ -140,7 +139,8 @@
}
}
-void ML_(delete_TyAdmin_and_payload) ( TyAdmin* ad ) {
+void ML_(delete_payload_of_TyAdmin) ( TyAdmin* ad ) {
+ vg_assert(ad);
vg_assert(ad->payload);
switch (ad->tag) {
case TyA_Type: delete_Type(ad->payload); break;
@@ -150,11 +150,9 @@
case TyA_Bounds: delete_TyBounds(ad->payload); break;
default: vg_assert(0);
}
- ML_(dinfo_free)(ad);
}
-
static void pp_XArray_of_pointersOrRefs ( XArray* xa ) {
Word i;
VG_(printf)("{");
|
|
From: <sv...@va...> - 2008-08-22 23:16:00
|
Author: sewardj
Date: 2008-08-23 00:16:06 +0100 (Sat, 23 Aug 2008)
New Revision: 8539
Log:
Try and bit a bit more space-economical, by increasing the
average loading factor from 0.75 to 0.83, and by being more
careful in VG_(cloneXA).
Modified:
trunk/coregrind/m_xarray.c
Modified: trunk/coregrind/m_xarray.c
===================================================================
--- trunk/coregrind/m_xarray.c 2008-08-22 14:47:20 UTC (rev 8538)
+++ trunk/coregrind/m_xarray.c 2008-08-22 23:16:06 UTC (rev 8539)
@@ -91,6 +91,13 @@
*nyu = *xa;
/* ... except we have to clone the contents-array */
if (nyu->arr) {
+ /* Restrict the total size of the new array to its current
+ actual size. That means we don't waste space copying the
+ unused tail of the original. The tradeoff is that it
+ guarantees we will have to resize the child if even one more
+ element is later added to it, unfortunately. */
+ nyu->totsizeE = nyu->usedsizeE;
+ /* and allocate .. */
nyu->arr = nyu->alloc( nyu->totsizeE * nyu->elemSzB );
if (!nyu->arr) {
nyu->free(nyu);
@@ -149,9 +156,9 @@
else if (xa->elemSzB == 2) newsz = 4;
else newsz = 2;
} else {
- newsz = 2 * xa->totsizeE;
+ newsz = 1 + (3 * xa->totsizeE) / 2; /* 2 * xa->totsizeE; */
}
- if (0)
+ if (0 && xa->totsizeE >= 10000)
VG_(printf)("addToXA: increasing from %ld to %ld\n",
xa->totsizeE, newsz);
tmp = xa->alloc(newsz * xa->elemSzB);
|
|
From: <sv...@va...> - 2008-08-22 14:47:13
|
Author: sewardj
Date: 2008-08-22 15:47:20 +0100 (Fri, 22 Aug 2008)
New Revision: 8538
Log:
* fix a massive space leak in shadowStack_unwind
* add proper error management
* add some more counters for performance analysis
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-21 22:50:45 UTC (rev 8537)
+++ branches/SGCHECK/exp-sgcheck/sg_main.c 2008-08-22 14:47:20 UTC (rev 8538)
@@ -47,9 +47,15 @@
#include "pub_tool_replacemalloc.h"
-static void preen_Invars ( Addr a, SizeT len, Bool isHeap ); /*fwds*/
+static
+void preen_Invars ( Addr a, SizeT len, Bool isHeap ); /*fwds*/
+static
+void record_error_SorG ( ThreadId tid,
+ Addr addr, SSizeT sszB,
+ HChar* expect, HChar* actual );
+
//////////////////////////////////////////////////////////////
// //
// Basic Stuff //
@@ -111,7 +117,11 @@
return aBig <= aSmall && aSmall + nSmall <= aBig + nBig;
}
+static Word Word__abs ( Word w ) {
+ return w < 0 ? -w : w;
+}
+
//////////////////////////////////////////////////////////////
// //
// StackBlocks Persistent Cache //
@@ -244,16 +254,17 @@
VG_(sortXA)( orig );
/* Now get rid of any duplicates. */
- { Word r, w, n = VG_(sizeXA)( orig );
+ { Word r, w, n = VG_(sizeXA)( orig ), nEQ;
if (n >= 2) {
w = 0;
+ nEQ = 0;
for (r = 0; r < n; r++) {
if (r+1 < n) {
StackBlock* pR0 = VG_(indexXA)( orig, r+0 );
StackBlock* pR1 = VG_(indexXA)( orig, r+1 );
Word c = StackBlock__cmp(pR0,pR1);
tl_assert(c == -1 || c == 0);
- if (c == 0) continue;
+ if (c == 0) { nEQ++; continue; }
}
if (w != r) {
StackBlock* pW = VG_(indexXA)( orig, w );
@@ -263,7 +274,7 @@
w++;
}
tl_assert(r == n);
- tl_assert(w <= n);
+ tl_assert(w + nEQ == n);
if (w < n) {
VG_(dropTailXA)( orig, n-w );
}
@@ -271,15 +282,16 @@
}
}
+ /* A rather poor sanity check on the results. */
{ Word i, n = VG_(sizeXA)( orig );
- for (i = 0; i < n-1; i++) {
- StackBlock* sb1 = (StackBlock*)VG_(indexXA)( orig, i );
- StackBlock* sb2 = (StackBlock*)VG_(indexXA)( orig, i+1 );
- if (sb1->base == sb2->base)
- pp_StackBlocks(orig);
- tl_assert(sb1->base != sb2->base);
+ for (i = 0; i < n-1; i++) {
+ StackBlock* sb1 = (StackBlock*)VG_(indexXA)( orig, i );
+ StackBlock* sb2 = (StackBlock*)VG_(indexXA)( orig, i+1 );
+ if (sb1->base == sb2->base)
+ pp_StackBlocks(orig);
+ tl_assert(sb1->base != sb2->base);
+ }
}
- }
/* Now, do we have it already? */
if (VG_(lookupFM)( frameBlocks_set, &key, &val, (UWord)orig )) {
@@ -825,7 +837,7 @@
static void show_Invar( HChar* buf, Word nBuf, Invar* inv, Word depth )
{
HChar* str;
- tl_assert(nBuf >= 128);
+ tl_assert(nBuf >= 96);
buf[0] = 0;
switch (inv->tag) {
case Inv_Unknown:
@@ -870,13 +882,14 @@
static ULong stats__classify_Unknown = 0;
static ULong stats__Invars_preened = 0;
static ULong stats__Invars_changed = 0;
+static ULong stats__t_i_b_empty = 0;
/* A dynamic instance of an instruction */
typedef
struct {
/* IMMUTABLE */
Addr insn_addr; /* NB! zero means 'not in use' */
- XArray* blocks; /* XArray* of StackBlock */
+ XArray* blocks; /* XArray* of StackBlock, or NULL if none */
/* MUTABLE */
Invar invar;
}
@@ -1146,6 +1159,7 @@
frame. */
{
Word i, nBlocks = VG_(sizeXA)( thisInstrBlocks );
+ if (nBlocks == 0) stats__t_i_b_empty++;
for (i = 0; i < nBlocks; i++) {
StackBlock* descr = VG_(indexXA)( thisInstrBlocks, i );
Addr bea = calculate_StackBlock_EA( descr, sp, fp );
@@ -1216,7 +1230,7 @@
Invar new_inv;
ThreadId tid = VG_(get_running_tid)();
StackFrame* frame;
- HChar buf[160];
+ HChar bufE[128], bufA[128];
stats__total_accesses++;
@@ -1239,8 +1253,7 @@
inv = &iinstance->invar;
- /* Deal with first uses of instruction instances. We hope this is
- rare, because it's expensive. */
+ /* Deal with first uses of instruction instances. */
if (inv->tag == Inv_Unset) {
/* This is the first use of this instance of the instruction, so
we can't make any check; we merely record what we saw, so we
@@ -1265,22 +1278,15 @@
if (eq_Invar(&new_inv, inv))
return;
- VG_(message)(Vg_UserMsg, "");
- VG_(message)(Vg_UserMsg, "Invalid %s of size %lu",
- sszB < 0 ? "write" : "read", szB );
- VG_(pp_ExeContext)(
- VG_(record_ExeContext)( tid, 0/*first_ip_delta*/ ) );
- // VG_(record_depth_1_ExeContext)( tid ) );
+ tl_assert(inv->tag != Inv_Unset);
- VG_(message)(Vg_UserMsg, " Address %#lx expected vs actual:", ea);
+ VG_(memset)(bufE, 0, sizeof(bufE));
+ show_Invar( bufE, sizeof(bufE)-1, inv, nFrames );
- VG_(memset)(buf, 0, sizeof(buf));
- show_Invar( buf, sizeof(buf)-1, inv, nFrames );
- VG_(message)(Vg_UserMsg, " Expected: %s", buf );
+ VG_(memset)(bufA, 0, sizeof(bufA));
+ show_Invar( bufA, sizeof(bufA)-1, &new_inv, nFrames );
- VG_(memset)(buf, 0, sizeof(buf));
- show_Invar( buf, sizeof(buf)-1, &new_inv, nFrames );
- VG_(message)(Vg_UserMsg, " Actual: %s", buf );
+ record_error_SorG( tid, ea, sszB, bufE, bufA );
/* And now install the new observation as "standard", so as to
make future error messages make more sense. */
@@ -1292,6 +1298,9 @@
/* Primary push-a-new-frame routine. Called indirectly from
generated code. */
+static UWord stats__max_sitree_size = 0;
+static UWord stats__max_gitree_size = 0;
+
static
void shadowStack_new_frame ( ThreadId tid,
Addr sp_at_call_insn,
@@ -1325,6 +1334,16 @@
caller->blocks_added_by_call,
n-1 /* stack depth at which these
blocks are considered to exist*/ );
+ if (0) { UWord s = VG_(sizeFM)( siTrees[tid] );
+ UWord g = VG_(sizeFM)( giTree );
+ Bool sb = s > stats__max_sitree_size;
+ Bool gb = g > stats__max_gitree_size;
+ 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 );
+ }
} else {
caller->blocks_added_by_call = NULL;
}
@@ -1415,6 +1434,7 @@
tl_assert(innermost->blocks_added_by_call != NULL);
del_blocks_from_StackTree( siTrees[tid],
innermost->blocks_added_by_call );
+ VG_(deleteXA)( innermost->blocks_added_by_call );
innermost->blocks_added_by_call = NULL;
}
/* That completes the required tidying of the interval tree
@@ -1518,6 +1538,8 @@
/* First off, find or create the StackBlocks for this instruction. */
frameBlocks = get_StackBlocks_for_IP( curr_IP );
tl_assert(frameBlocks);
+ //if (VG_(sizeXA)( frameBlocks ) == 0)
+ // frameBlocks = NULL;
/* Generate a call to "helperc__mem_access", passing:
addr current_SP current_FP szB curr_IP frameBlocks
@@ -1780,6 +1802,172 @@
0, VG_(get_IP)(tid), NULL );
}
+
+//////////////////////////////////////////////////////////////
+// //
+// Error management //
+// //
+//////////////////////////////////////////////////////////////
+
+typedef
+ enum {
+ XE_SorG=1202 /* stack or global array inconsistency */
+ }
+ XErrorTag;
+
+typedef
+ enum {
+ XS_SorG=2021
+ }
+ XSuppTag;
+
+typedef
+ struct {
+ XErrorTag tag;
+ union {
+ struct {
+ Addr addr;
+ SSizeT sszB;
+ HChar expect[128];
+ HChar actual[128];
+ } SorG;
+ } XE;
+ }
+ XError;
+
+static void init_XError ( XError* xe ) {
+ VG_(memset)(xe, 0, sizeof(*xe) );
+ xe->tag = XE_SorG-1; /* bogus */
+}
+
+
+/* Updates the copy with extra info if necessary. Nothing to do here;
+ we do all the work up front in the record_error_* functions. */
+static UInt sg_update_extra ( Error* err )
+{
+ XError* extra = (XError*)VG_(get_error_extra)(err);
+ tl_assert(extra);
+ return sizeof(XError);
+}
+
+static void record_error_SorG ( ThreadId tid,
+ Addr addr, SSizeT sszB,
+ HChar* expect, HChar* actual )
+{
+ XError xe;
+ init_XError(&xe);
+ xe.XE.SorG.addr = addr;
+ xe.XE.SorG.sszB = sszB;
+ VG_(strncpy)( &xe.XE.SorG.expect[0], expect, sizeof(xe.XE.SorG.expect) );
+ VG_(strncpy)( &xe.XE.SorG.actual[0], actual, sizeof(xe.XE.SorG.actual) );
+ xe.XE.SorG.expect[ sizeof(xe.XE.SorG.expect)-1 ] = 0;
+ xe.XE.SorG.actual[ sizeof(xe.XE.SorG.actual)-1 ] = 0;
+ VG_(maybe_record_error)( tid, XE_SorG, 0, NULL, &xe );
+}
+
+static Bool eq_Error ( VgRes not_used, Error* e1, Error* e2 )
+{
+ XError *xe1, *xe2;
+
+ tl_assert(VG_(get_error_kind)(e1) == VG_(get_error_kind)(e2));
+
+ xe1 = (XError*)VG_(get_error_extra)(e1);
+ xe2 = (XError*)VG_(get_error_extra)(e2);
+ tl_assert(xe1);
+ tl_assert(xe2);
+
+ switch (VG_(get_error_kind)(e1)) {
+ case XE_SorG:
+ return //xe1->XE.SorG.addr == xe2->XE.SorG.addr
+ //&&
+ xe1->XE.SorG.sszB == xe2->XE.SorG.sszB
+ && 0 == VG_(strncmp)( &xe1->XE.SorG.expect[0],
+ &xe2->XE.SorG.expect[0],
+ sizeof(xe1->XE.SorG.expect) )
+ && 0 == VG_(strncmp)( &xe1->XE.SorG.actual[0],
+ &xe2->XE.SorG.actual[0],
+ sizeof(xe1->XE.SorG.actual) );
+ default:
+ tl_assert(0);
+ }
+
+ /*NOTREACHED*/
+ tl_assert(0);
+}
+
+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)) {
+
+ case XE_SorG:
+ tl_assert(xe);
+ VG_(message)(Vg_UserMsg, "Invalid %s of size %ld",
+ xe->XE.SorG.sszB < 0 ? "write" : "read",
+ Word__abs(xe->XE.SorG.sszB) );
+ VG_(pp_ExeContext)( VG_(get_error_where)(err) );
+ VG_(message)(Vg_UserMsg, " Address %#lx expected vs actual:",
+ xe->XE.SorG.addr);
+ VG_(message)(Vg_UserMsg, " Expected: %s", &xe->XE.SorG.expect[0] );
+ VG_(message)(Vg_UserMsg, " Actual: %s", &xe->XE.SorG.actual[0] );
+ break;
+
+ default:
+ tl_assert(0);
+ } /* switch (VG_(get_error_kind)(err)) */
+}
+
+static Char* sg_get_error_name ( Error* err )
+{
+ switch (VG_(get_error_kind)(err)) {
+ case XE_SorG: return "SorG";
+ default: tl_assert(0); /* fill in missing case */
+ }
+}
+
+static Bool sg_recognised_suppression ( Char* name, Supp *su )
+{
+# define TRY(_name,_xskind) \
+ if (0 == VG_(strcmp)(name, (_name))) { \
+ VG_(set_supp_kind)(su, (_xskind)); \
+ return True; \
+ }
+ TRY("SorG", XS_SorG);
+ return False;
+# undef TRY
+}
+
+static Bool sg_read_extra_suppression_info ( Int fd, Char* buf, Int nBuf,
+ Supp* su )
+{
+ /* do nothing -- no extra suppression info present. Return True to
+ indicate nothing bad happened. */
+ return True;
+}
+
+static Bool sg_error_matches_suppression ( Error* err, Supp* su )
+{
+ switch (VG_(get_supp_kind)(su)) {
+ case XS_SorG: return VG_(get_error_kind)(err) == XE_SorG;
+ //case XS_: return VG_(get_error_kind)(err) == XE_;
+ default: tl_assert(0); /* fill in missing cases */
+ }
+}
+
+static void sg_print_extra_suppression_info ( Error* err )
+{
+ /* Do nothing */
+}
+
+
+//////////////////////////////////////////////////////////////
+// //
+// main //
+// //
+//////////////////////////////////////////////////////////////
+
/* CALLED indirectly FROM GENERATED CODE */
static void sg_die_mem_stack ( Addr old_SP, SizeT len ) {
ThreadId tid = VG_(get_running_tid)();
@@ -1810,6 +1998,8 @@
VG_(message)(Vg_DebugMsg,
"%'llu Invars preened, of which %'llu changed",
stats__Invars_preened, stats__Invars_changed);
+ VG_(message)(Vg_DebugMsg,
+ " t_i_b_MT: %'12llu", stats__t_i_b_empty);
VG_(message)(Vg_DebugMsg, "");
}
@@ -1828,6 +2018,17 @@
VG_(needs_var_info) ();
+ VG_(needs_core_errors) ();
+ VG_(needs_tool_errors) (eq_Error,
+ pp_Error,
+ True,/*show TIDs for errors*/
+ sg_update_extra,
+ sg_recognised_suppression,
+ sg_read_extra_suppression_info,
+ sg_error_matches_suppression,
+ sg_get_error_name,
+ sg_print_extra_suppression_info);
+
ourGlobals_init();
init_StackBlocks_set();
init_GlobalBlock_set();
|
|
From: Tom H. <th...@cy...> - 2008-08-22 03:07:56
|
Nightly build on alvis ( i686, Red Hat 7.3 ) started at 2008-08-22 03:15:02 BST Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 345 tests, 61 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/faultstatus (stderr) none/tests/mremap2 (stdout) none/tests/shell (stderr) none/tests/shell_valid1 (stderr) none/tests/shell_valid2 (stderr) none/tests/shell_valid3 (stderr) helgrind/tests/hg01_all_ok (stderr) helgrind/tests/hg02_deadlock (stderr) helgrind/tests/hg03_inherit (stderr) helgrind/tests/hg04_race (stderr) helgrind/tests/hg05_race2 (stderr) helgrind/tests/hg06_readshared (stderr) helgrind/tests/tc01_simple_race (stderr) helgrind/tests/tc02_simple_tls (stderr) helgrind/tests/tc03_re_excl (stderr) helgrind/tests/tc05_simple_race (stderr) helgrind/tests/tc06_two_races (stderr) helgrind/tests/tc07_hbl1 (stderr) helgrind/tests/tc08_hbl2 (stderr) helgrind/tests/tc09_bad_unlock (stderr) helgrind/tests/tc11_XCHG (stderr) helgrind/tests/tc12_rwl_trivial (stderr) helgrind/tests/tc14_laog_dinphils (stderr) helgrind/tests/tc16_byterace (stderr) helgrind/tests/tc17_sembar (stderr) helgrind/tests/tc18_semabuse (stderr) helgrind/tests/tc19_shadowmem (stderr) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc21_pthonce (stderr) helgrind/tests/tc22_exit_w_lock (stderr) helgrind/tests/tc23_bogus_condwait (stderr) helgrind/tests/tc24_nonzero_sem (stderr) |
|
From: Tom H. <th...@cy...> - 2008-08-22 02:54:58
|
Nightly build on aston ( x86_64, Fedora Core 5 ) started at 2008-08-22 03:20:07 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 == 443 tests, 9 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/faultstatus (stderr) none/tests/mremap2 (stdout) helgrind/tests/tc17_sembar (stderr) 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 == 443 tests, 9 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/faultstatus (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 Fri Aug 22 03:37:46 2008 --- new.short Fri Aug 22 03:55:06 2008 *************** *** 16,19 **** none/tests/mremap2 (stdout) helgrind/tests/tc20_verifywrap (stderr) - helgrind/tests/tc21_pthonce (stderr) helgrind/tests/tc22_exit_w_lock (stderr) --- 16,19 ---- none/tests/mremap2 (stdout) + helgrind/tests/tc17_sembar (stderr) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc22_exit_w_lock (stderr) |
|
From: Tom H. <th...@cy...> - 2008-08-22 02:46:52
|
Nightly build on lloyd ( x86_64, Fedora 7 ) started at 2008-08-22 03:05:05 BST Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 437 tests, 7 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/faultstatus (stderr) none/tests/mremap2 (stdout) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc22_exit_w_lock (stderr) |
|
From: Tom H. <th...@cy...> - 2008-08-22 02:41:37
|
Nightly build on trojan ( x86_64, Fedora Core 6 ) started at 2008-08-22 03:25: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 == 441 tests, 9 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/faultstatus (stderr) none/tests/mremap2 (stdout) helgrind/tests/tc20_verifywrap (stderr) helgrind/tests/tc21_pthonce (stderr) helgrind/tests/tc22_exit_w_lock (stderr) ================================================= == Results from 24 hours ago == ================================================= Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 441 tests, 10 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/faultstatus (stderr) none/tests/mremap2 (stdout) helgrind/tests/tc17_sembar (stderr) 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 Fri Aug 22 03:33:29 2008 --- new.short Fri Aug 22 03:41:45 2008 *************** *** 8,10 **** ! == 441 tests, 10 stderr failures, 5 stdout failures, 0 post failures == memcheck/tests/file_locking (stderr) --- 8,10 ---- ! == 441 tests, 9 stderr failures, 5 stdout failures, 0 post failures == memcheck/tests/file_locking (stderr) *************** *** 20,22 **** none/tests/mremap2 (stdout) - helgrind/tests/tc17_sembar (stderr) helgrind/tests/tc20_verifywrap (stderr) --- 20,21 ---- |
|
From: Tom H. <th...@cy...> - 2008-08-22 02:23:44
|
Nightly build on gill ( x86_64, Fedora Core 2 ) started at 2008-08-22 03:00:04 BST Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 443 tests, 32 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/faultstatus (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) |