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
(31) |
2
(27) |
|
3
(25) |
4
(21) |
5
(21) |
6
(21) |
7
(32) |
8
(23) |
9
(15) |
|
10
(12) |
11
(9) |
12
(10) |
13
(10) |
14
(9) |
15
(7) |
16
(20) |
|
17
(14) |
18
(71) |
19
(67) |
20
(50) |
21
(25) |
22
(15) |
23
(37) |
|
24
(25) |
25
(41) |
26
(34) |
27
(57) |
28
(20) |
29
(30) |
30
(13) |
|
31
(18) |
|
|
|
|
|
|
|
From: <sv...@va...> - 2005-07-21 23:32:55
|
Author: njn
Date: 2005-07-22 00:26:25 +0100 (Fri, 22 Jul 2005)
New Revision: 4225
Log:
Re-institute SegInfo reference counting and deallocation.
Modified:
trunk/coregrind/m_aspacemgr/aspacemgr.c
trunk/coregrind/m_debuginfo/symtab.c
Modified: trunk/coregrind/m_aspacemgr/aspacemgr.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/m_aspacemgr/aspacemgr.c 2005-07-21 21:26:07 UTC (rev =
4224)
+++ trunk/coregrind/m_aspacemgr/aspacemgr.c 2005-07-21 23:26:25 UTC (rev =
4225)
@@ -31,7 +31,7 @@
*/
=20
#include "pub_core_basics.h"
-#include "pub_core_debuginfo.h" // Needed for pub_core_aspacemgr :(
+#include "pub_core_debuginfo.h" // Needed for pub_core_aspacemgr.h :(
#include "pub_core_aspacemgr.h"
#include "pub_core_libcbase.h"
#include "pub_core_libcassert.h"
@@ -168,7 +168,7 @@
=20
vg_assert(name);
=20
- if (0) VG_(printf)("alloc_segname %s\n", name);
+ if (0) VG_(printf)("allocate_segname %s\n", name);
=20
len =3D VG_(strlen)(name);
if (len >=3D VG_MAX_SEGNAMELEN-1) {
@@ -320,6 +320,8 @@
segments_used++;
}
=20
+// Forward declaration
+static void dealloc_seg_memory(Segment *s);
=20
/* Shift segments [i+1 .. segments_used-1] down by one, and decrement
segments_used.=20
@@ -328,8 +330,10 @@
{
Int j;
vg_assert(i >=3D 0 && i < segments_used);
- for (j =3D i+1; j < segments_used; j++)
- segments[j-1] =3D segments[j];
+ dealloc_seg_memory(&segments[i]);
+ for (j =3D i+1; j < segments_used; j++) {
+ segments[j-1] =3D segments[j];
+ }
segments_used--;
vg_assert(segments_used >=3D 0 && segments_used < VG_N_SEGMENTS);
}
@@ -434,8 +438,12 @@
vg_assert(a > segments[r].addr);
delta =3D a - segments[r].addr;
make_space_at(r);
+ =20
segments[r] =3D segments[r+1];
segments[r].len =3D delta;
+ if (segments[r].seginfo)
+ VG_(seginfo_incref)(segments[r].seginfo);
+ =20
segments[r+1].len -=3D delta;
segments[r+1].addr +=3D delta;
segments[r+1].offset +=3D delta;
@@ -527,6 +535,10 @@
s->addr, s->addr+s->len,
s1->addr, s1->addr+s1->len);
s->len +=3D s1->len;
+
+ vg_assert(s->seginfo =3D=3D s1->seginfo);
+ dealloc_seg_memory(s1);
+ =20
continue;
}
if (wr < rd)
@@ -570,36 +582,16 @@
return (p < se && pe > s->addr);
}
=20
-#if 0
-/* 20050228: apparently unused */
-/* Prepare a Segment structure for recycling by freeing everything
- hanging off it. */
-static void recycleseg(Segment *s)
-{
- if (s->flags & SF_CODE)
- VG_(discard_translations)(s->addr, s->len);
-
- if (s->filename !=3D NULL)
- VG_(arena_free)(VG_AR_CORE, (Char *)s->filename);
-
- /* keep the SegInfo, if any - it probably still applies */
-}
-
/* When freeing a Segment, also clean up every one else's ideas of
what was going on in that range of memory */
-static void freeseg(Segment *s)
+static void dealloc_seg_memory(Segment *s)
{
- recycleseg(s);
if (s->seginfo !=3D NULL) {
VG_(seginfo_decref)(s->seginfo, s->addr);
s->seginfo =3D NULL;
}
-
- VG_(SkipNode_Free)(&sk_segments, s);
}
-#endif
=20
-
/* Get rid of any translations arising from s. */
/* Note, this is not really the job of the low level memory manager.
When it comes time to rewrite this subsystem, clean this up. */
@@ -784,7 +776,7 @@
preen_segments();
if (0) show_segments("after map_file_segment");
=20
- /* If this mapping is of the beginning of a file, isn't part of
+ /* If this mapping is at the beginning of a file, isn't part of
Valgrind, is at least readable and seems to contain an object
file, then try reading symbols from it.
=20
@@ -824,21 +816,23 @@
s->seginfo =3D VG_(read_seg_symbols)(s->addr, s->len, s->offset=
,
s->filename);
}
- //else=20
- //if (flags & SF_MMAP) {
- // const SegInfo *info;
- //
- // /* Otherwise see if an existing SegInfo applies to this Segme=
nt */
- // for(info =3D VG_(next_seginfo)(NULL);
- // info !=3D NULL;
- // info =3D VG_(next_seginfo)(info)) {
- // if (VG_(seg_overlaps)(s, VG_(seg_start)(info), VG_(seg_siz=
e)(info)))
- // {
- // s->seginfo =3D (SegInfo *)info;
- // VG_(seginfo_incref)((SegInfo *)info);
- // }
- // }
- //}
+ else if (flags & SF_MMAP)=20
+ {
+ const SegInfo *si;
+ =20
+ /* Otherwise see if an existing SegInfo applies to this Segment=
*/
+ for (si =3D VG_(next_seginfo)(NULL);
+ si !=3D NULL;
+ si =3D VG_(next_seginfo)(si))=20
+ {
+ if (VG_(seg_overlaps)(s, VG_(seginfo_start)(si),=20
+ VG_(seginfo_size)(si)))
+ {
+ s->seginfo =3D (SegInfo *)si;
+ VG_(seginfo_incref)((SegInfo *)si);
+ }
+ }
+ }
}
=20
/* clean up */
Modified: trunk/coregrind/m_debuginfo/symtab.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/m_debuginfo/symtab.c 2005-07-21 21:26:07 UTC (rev 422=
4)
+++ trunk/coregrind/m_debuginfo/symtab.c 2005-07-21 23:26:25 UTC (rev 422=
5)
@@ -1388,7 +1388,7 @@
if (seg->symtab !=3D NULL)
VG_(seginfo_decref)(seg->symtab, seg->addr);
=20
- VG_(symtab_incref)(si);
+ VG_(seginfo_incref)(si);
seg->symtab =3D si;
=20
if (0)
@@ -1702,6 +1702,7 @@
=20
void VG_(seginfo_decref)(SegInfo *si, Addr start)
{
+ vg_assert(si);
vg_assert(si->ref >=3D 1);
if (--si->ref =3D=3D 0)
unload_symbols(si->start, si->size);
@@ -1709,6 +1710,7 @@
=20
void VG_(seginfo_incref)(SegInfo *si)
{
+ vg_assert(si);
vg_assert(si->ref > 0);
si->ref++;
}
|
|
From: <sv...@va...> - 2005-07-21 21:34:31
|
Author: sewardj
Date: 2005-07-21 22:33:57 +0100 (Thu, 21 Jul 2005)
New Revision: 1288
Log:
Reinstate rlwnm and change ROTL32 back to what it looked like before I
messed it up :-)
Modified:
trunk/priv/guest-ppc32/toIR.c
Modified: trunk/priv/guest-ppc32/toIR.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/guest-ppc32/toIR.c 2005-07-21 17:07:18 UTC (rev 1287)
+++ trunk/priv/guest-ppc32/toIR.c 2005-07-21 21:33:57 UTC (rev 1288)
@@ -649,24 +649,34 @@
}
=20
// ROTL(src32, rot_amt5)
-static IRExpr* ROTL32 ( IRExpr* src, Int rot_amt )
+static IRExpr* ROTL32 ( IRExpr* src, IRExpr* rot_amt )
{
+ IRExpr* masked;
vassert(typeOfIRExpr(irbb->tyenv,src) =3D=3D Ity_I32);
- vassert(rot_amt >=3D 0 && rot_amt < 32); =20
+ vassert(typeOfIRExpr(irbb->tyenv,rot_amt) =3D=3D Ity_I32);
=20
- if (rot_amt =3D=3D 0)
- return src;
+ masked=20
+ =3D unop(Iop_32to8, binop(Iop_And32, rot_amt, mkU32(31)));
=20
- vassert(rot_amt > 0 && rot_amt < 32); =20
-
// (src << rot_amt) | (src >> (32-rot_amt))
- return binop(Iop_Or32,
- binop(Iop_Shl32, src, mkU8(rot_amt)),
- binop(Iop_Shr32, src, mkU8(32-rot_amt)));
+ /* Note: the MuxOX is not merely an optimisation; it's needed
+ because otherwise the Shr32 is a shift by the word size when
+ masked denotes zero. For rotates by immediates, a lot of
+ this junk gets folded out. */
+ return=20
+ IRExpr_Mux0X(=20
+ masked,
+ /* zero rotate. */
+ src,
+ /* non-zero rotate */
+ binop( Iop_Or32,
+ binop(Iop_Shl32, src, masked),
+ binop(Iop_Shr32, src, binop(Iop_Sub8, mkU8(32), masked))
+ )
+ );
}
=20
=20
-
/*------------------------------------------------------------*/
/*--- Helpers for condition codes. ---*/
/*------------------------------------------------------------*/
@@ -2181,7 +2191,6 @@
UChar flag_Rc =3D toUChar((theInstr >> 0) & 1); /* theInstr[0] =
*/
=20
UInt mask =3D MASK(31-MaskEnd, 31-MaskBegin);
- IRTemp rot_amt =3D newTemp(Ity_I8);
IRTemp Rs =3D newTemp(Ity_I32);
IRTemp Ra =3D newTemp(Ity_I32);
IRTemp Rb =3D newTemp(Ity_I32);
@@ -2190,33 +2199,35 @@
assign( Rb, getIReg(Rb_addr) );
=20
switch (opc1) {
- case 0x14: // rlwimi (Rotate Left Word Immediate then Mask Insert, PP=
C32 p500)
+ case 0x14:=20
+ // rlwimi (Rotate Left Word Immediate then Mask Insert, PPC32 p500=
)
DIP("rlwimi%s r%d,r%d,%d,%d,%d\n", flag_Rc ? "." : "",
Ra_addr, Rs_addr, sh_imm, MaskBegin, MaskEnd);
// Ra =3D (ROTL(Rs, Imm) & mask) | (Ra & ~mask);
assign( Ra, binop(Iop_Or32,
binop(Iop_And32, mkU32(mask),
- ROTL32(mkexpr(Rs), sh_imm)),
+ ROTL32(mkexpr(Rs), mkU32(sh_imm))),
binop(Iop_And32, getIReg(Ra_addr), mkU32(~mask))=
) );
break;
=20
- case 0x15: // rlwinm (Rotate Left Word Immediate then AND with Mask, =
PPC32 p501)
+ case 0x15:=20
+ // rlwinm (Rotate Left Word Immediate then AND with Mask, PPC32 p5=
01)
DIP("rlwinm%s r%d,r%d,%d,%d,%d\n", flag_Rc ? "." : "",
Ra_addr, Rs_addr, sh_imm, MaskBegin, MaskEnd);
// Ra =3D ROTL(Rs, Imm) & mask
- assign( Ra, binop(Iop_And32, ROTL32(mkexpr(Rs), sh_imm),=20
+ assign( Ra, binop(Iop_And32, ROTL32(mkexpr(Rs), mkU32(sh_imm)),=20
mkU32(mask)) );
break;
=20
-//zz case 0x17: // rlwnm (Rotate Left Word then AND with Mask, PPC32 =
p503
-//zz DIP("rlwnm%s r%d,r%d,r%d,%d,%d\n", flag_Rc ? "." : "",
-//zz Ra_addr, Rs_addr, Rb_addr, MaskBegin, MaskEnd);
-//zz // Ra =3D ROTL(Rs, Rb[0-4]) & mask
-//zz assign( rot_amt,
-//zz unop(Iop_32to8, binop(Iop_And32, mkexpr(Rb), mkU32(0x=
1F))) );
-//zz assign( Ra, binop(Iop_And32,
-//zz ROTL32(mkexpr(Rs), mkexpr(rot_amt)), mkU32(=
mask)) );
-//zz break;
+ case 0x17:=20
+ // rlwnm (Rotate Left Word then AND with Mask, PPC32 p503
+ DIP("rlwnm%s r%d,r%d,r%d,%d,%d\n", flag_Rc ? "." : "",
+ Ra_addr, Rs_addr, Rb_addr, MaskBegin, MaskEnd);
+ // Ra =3D ROTL(Rs, Rb[0-4]) & mask
+ // note, ROTL32 does the masking, so we don't do it here
+ assign( Ra, binop(Iop_And32, ROTL32(mkexpr(Rs), mkexpr(Rb)),=20
+ mkU32(mask)) );
+ break;
=20
default:
vex_printf("dis_int_rot(PPC32)(opc1)\n");
|
|
From: <sv...@va...> - 2005-07-21 21:32:43
|
Author: njn
Date: 2005-07-21 22:26:07 +0100 (Thu, 21 Jul 2005)
New Revision: 4224
Log:
Improve script to compare the current code with that from 24 hours ago,
and print the diff if they aren't the same.
Modified:
trunk/nightly/bin/nightly
Modified: trunk/nightly/bin/nightly
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/nightly/bin/nightly 2005-07-21 20:23:26 UTC (rev 4223)
+++ trunk/nightly/bin/nightly 2005-07-21 21:26:07 UTC (rev 4224)
@@ -1,74 +1,159 @@
#!/bin/sh
=20
-# Automated build and test for Valgrind. =20
+#-----------------------------------------------------------------------=
-----
+# Automated build and test for Valgrind. Compares Valgrind from 24 hour=
s
+# ago with the current one.
+#
# Use: two args, first is path to top of ValgrindABT tree
# second is name of machine
+#-----------------------------------------------------------------------=
-----
=20
+#-----------------------------------------------------------------------=
-----
+# Helper function
+#-----------------------------------------------------------------------=
-----
+
runcmd () {
- echo -n " $1 ... " >> log.short
- shift
+ logfile=3D$1
+ str=3D$2
+ shift 2
=20
- (eval "$*") >> log.verbose 2>&1
+ # Header in short logfile
+ echo -n " $str ... " >> $logfile.short
=20
- if [ $? =3D=3D 0 ]
+ # Header and command in verbose logfile
+ echo -n " $str ... " >> $logfile.verbose
+ echo "$*" >> $logfile.verbose
+
+ # Run the command
+ (eval "$*") >> $logfile.verbose 2>&1
+ res=3D$?
+
+ # Write result to the short logfile
+ if [ $res =3D=3D 0 ]
then
- echo "done" >> log.short
- return 0
+ echo "done" >> $logfile.short
else
- echo "failed" >> log.short
- return 1
+ echo "failed" >> $logfile.short
fi
+
+ return $res
}
=20
+#-----------------------------------------------------------------------=
-----
+# Startup
+#-----------------------------------------------------------------------=
-----
+# Get args from command line
ABT_TOP=3D$1
ABT_MACHINE=3D$2
=20
+# Get times and date
ABT_START=3D`date "+%F %H:%M:%S %Z"`
=20
+svn_old_date=3D`date --date=3Dyesterday +%Y-%m-%dT%H:%M:%S`
+svn_new_date=3D`date --date=3Dtoday +%Y-%m-%dT%H:%M:%S`
+
cd $ABT_TOP
=20
source $ABT_TOP/conf/$ABT_MACHINE.conf
=20
-rm -rf log.verbose log.short valgrind
=20
-echo > log.short
-echo > log.verbose
+#-----------------------------------------------------------------------=
-----
+# Check out, build, test
+#-----------------------------------------------------------------------=
-----
=20
-echo "Nightly build on" $ABT_MACHINE "(" $ABT_DETAILS ") started at" $AB=
T_START >> log.short
-echo >> log.short
+# Do everything twice -- once for the 24 hours old Valgrind, and once=20
+# for the current one.
+for logfile in old new ; do
=20
-echo "Nightly build on" $ABT_MACHINE "(" $ABT_DETAILS ") started at" $AB=
T_START >> log.verbose
-echo >> log.verbose
+ # Remove the old valgrind/ and vex/ directories
+ rm -rf valgrind vex
=20
-runcmd "Checking out vex source tree " \
- "svn co svn://svn.valgrind.org/vex/trunk vex" && \
-\
-runcmd "Building vex " \
- "cd vex && pwd && make clean version all" && \
-\
-runcmd "Checking out valgrind source tree" \
- "svn co svn://svn.valgrind.org/valgrind/trunk valgrind" && \
-\
-runcmd "Configuring valgrind " \
- "cd valgrind && ./autogen.sh && ./configure --prefix=3D$ABT_TOP/=
Inst --with-vex=3D$ABT_TOP/vex" && \
-\
-runcmd "Building valgrind " \
- "cd valgrind && make && make install" && \
-\
-runcmd "Running regression tests " \
- "cd valgrind && make regtest"
+ # Remove old short and verbose log files, and start the new ones
+ for ext in short verbose ; do
+ echo > $logfile.$ext
+ done
=20
-egrep -q '^=3D=3D [0-9]+ tests' log.verbose && (
- echo >> log.short
- echo "Regression test results follow" >> log.short
- echo >> log.short
- awk '/^=3D=3D [0-9]+ tests/, /^$/ { print }' log.verbose >> log.short
-) || (
- echo >> log.short
- echo "Last 20 lines of log.verbose follow" >> log.short
- echo >> log.short
- tail -20 log.verbose >> log.short
-)
+ # Choose the current Valgrind, or one from 24 hours ago
+ if [ $logfile =3D "old" ] ; then
+ svn_date=3D$svn_old_date
+ else
+ svn_date=3D$svn_new_date
+ fi
=20
-$ABT_TOP/conf/$ABT_MACHINE.sendmail "$ABT_START nightly build ($ABT_MACH=
INE, $ABT_DETAILS)" \
- $ABT_TOP/log.short
+ # Get dates for the old and new versions
+
+ # Check out, build, run tests
+ runcmd $logfile \
+ "Checking out vex source tree " \
+ "svn co svn://svn.valgrind.org/vex/trunk -r {$svn_date} vex" &=
& \
+ \
+ runcmd $logfile \
+ "Building vex " \
+ "cd vex && pwd && make clean version all" && \
+ \
+ runcmd $logfile \
+ "Checking out valgrind source tree" \
+ "svn co svn://svn.valgrind.org/valgrind/trunk -r {$svn_date} v=
algrind" && \
+ \
+ runcmd $logfile \
+ "Configuring valgrind " \
+ "cd valgrind && ./autogen.sh && ./configure --prefix=3D$ABT_T=
OP/Inst --with-vex=3D$ABT_TOP/vex" && \
+ \
+ runcmd $logfile \
+ "Building valgrind " \
+ "cd valgrind && make && make install" && \
+ \
+ runcmd $logfile \
+ "Running regression tests " \
+ "cd valgrind && make regtest"
+
+ # Grab some indicative text for the short log file -- if the regtests
+ # succeeded, show their results. If we didn't make it that far, show=
the
+ # last 20 lines.
+ egrep -q '^=3D=3D [0-9]+ tests' $logfile.verbose && (
+ echo >> $logfile.short
+ echo "Regression test results follow" >> $logfile.short
+ echo >> $logfile.short
+ awk '/^=3D=3D [0-9]+ tests/, /^$/ { print }' $logfile.verbose >> $=
logfile.short
+ ) || (
+ echo >> $logfile.short
+ echo "Last 20 lines of verbose log follow" >> $logfile.short \
+ echo >> $logfile.short
+ tail -20 $logfile.verbose >> $logfile.short
+ )
+done
+
+#-----------------------------------------------------------------------=
-----
+# Prepare results and send
+#-----------------------------------------------------------------------=
-----
+
+# 'final' shows the difference between the old and new results
+echo > final
+echo "Nightly build on" $ABT_MACHINE "(" $ABT_DETAILS ")" \
+ "started at" $ABT_START >> final
+
+# Always show the current results.
+cat new.short >> final
+
+# If the results differ from 24 hours ago, print extra stuff.
+diff -C1 old.short new.short > diff.short
+
+if [ $? !=3D 0 ] ; then
+ echo "=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D" >> final
+ echo "=3D=3D Results from 24 hours ago =3D=3D" >> f=
inal
+ echo "=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D" >> final
+ cat old.short >> final
+
+ echo >> final
+ echo "=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D" >> final
+ echo "=3D=3D Difference between 24 hours ago and now =3D=3D" >> f=
inal
+ echo "=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D" >> final
+ echo >> final
+ cat diff.short >> final
+ echo >> final
+fi
+
+# Email the results
+$ABT_TOP/conf/$ABT_MACHINE.sendmail \
+ "$ABT_START nightly build ($ABT_MACHINE, $ABT_DETAILS)" \
+ $ABT_TOP/final
|
|
From: <sv...@va...> - 2005-07-21 20:23:52
|
Author: tom
Date: 2005-07-21 21:23:26 +0100 (Thu, 21 Jul 2005)
New Revision: 4223
Log:
Enable rt_sigpending on amd64. Fixes bug #109429.
Modified:
trunk/coregrind/m_syswrap/syswrap-amd64-linux.c
Modified: trunk/coregrind/m_syswrap/syswrap-amd64-linux.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/m_syswrap/syswrap-amd64-linux.c 2005-07-21 15:25:04 U=
TC (rev 4222)
+++ trunk/coregrind/m_syswrap/syswrap-amd64-linux.c 2005-07-21 20:23:26 U=
TC (rev 4223)
@@ -1265,7 +1265,7 @@
=20
// (__NR_capget, sys_capget), // 125=20
// (__NR_capset, sys_capset), // 126=20
-//zz GENXY(__NR_rt_sigpending, sys_rt_sigpending), // 127=20
+ GENXY(__NR_rt_sigpending, sys_rt_sigpending), // 127=20
GENXY(__NR_rt_sigtimedwait, sys_rt_sigtimedwait),// 128=20
GENXY(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo),// 129=20
=20
|
|
From: <sv...@va...> - 2005-07-21 17:07:22
|
Author: sewardj
Date: 2005-07-21 18:07:18 +0100 (Thu, 21 Jul 2005)
New Revision: 1287
Log:
Fix XER.OV computation after multiply.
Modified:
trunk/priv/guest-ppc32/toIR.c
Modified: trunk/priv/guest-ppc32/toIR.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/guest-ppc32/toIR.c 2005-07-21 16:58:55 UTC (rev 1286)
+++ trunk/priv/guest-ppc32/toIR.c 2005-07-21 17:07:18 UTC (rev 1287)
@@ -992,7 +992,7 @@
/* OV true if result can't be represented in 32 bits
i.e sHi !=3D sign extension of sLo */
t64 =3D newTemp(Ity_I64);
- assign( t64, binop(Iop_MullU32, argL, argR) );
+ assign( t64, binop(Iop_MullS32, argL, argR) );
xer_ov=20
=3D binop( Iop_CmpNE32,
unop(Iop_64HIto32, mkexpr(t64)),
|
|
From: Nicholas N. <nj...@cs...> - 2005-07-21 17:01:45
|
On Thu, 21 Jul 2005, Dirk Mueller wrote: > BUGS FIXED: > > Standford code checker. s/Standford/Stanford/ > Thats not a big list, but its still something I think. So would it be okay > with everyone if I prepare a tarball and prepare updates to the website? Seems ok to me. The lack of response seems to indicate that no-one else has strong opinions either. I wonder if it's worth doing a release candidate, but if it's only bug fixes things should (in theory) work ok out of the box. N |
|
From: <sv...@va...> - 2005-07-21 16:59:48
|
Author: sewardj
Date: 2005-07-21 17:58:55 +0100 (Thu, 21 Jul 2005)
New Revision: 1286
Log:
Fix very stupid bug in my mtxer implementation. The relevant IRStmts
would work better (viz, at all :-) if they were added to the IR code
list after being created, instead of merely being dropped down the
back of the fridge.
Modified:
trunk/priv/guest-ppc32/toIR.c
Modified: trunk/priv/guest-ppc32/toIR.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/guest-ppc32/toIR.c 2005-07-21 14:48:31 UTC (rev 1285)
+++ trunk/priv/guest-ppc32/toIR.c 2005-07-21 16:58:55 UTC (rev 1286)
@@ -3691,32 +3691,32 @@
switch (SPR_flipped) { // Choose a register...
case 0x1:
DIP("mtxer r%d\n", Rs_addr);
- IRStmt_Put(=20
+ stmt(IRStmt_Put(=20
OFFB_XER_SO,=20
unop( Iop_32to8,=20
binop( Iop_And32,=20
- binop(Iop_Shr32, mkexpr(Rs_addr), mkU8(31)),=
=20
+ binop(Iop_Shr32, mkexpr(Rs), mkU8(31)),=20
mkU32(1)) )=20
- );
- IRStmt_Put(=20
+ ));
+ stmt(IRStmt_Put(=20
OFFB_XER_OV,=20
unop( Iop_32to8,=20
binop( Iop_And32,=20
- binop(Iop_Shr32, mkexpr(Rs_addr), mkU8(30)),=
=20
+ binop(Iop_Shr32, mkexpr(Rs), mkU8(30)),=20
mkU32(1)) )=20
- );
- IRStmt_Put(=20
+ ));
+ stmt(IRStmt_Put(=20
OFFB_XER_CA,=20
unop( Iop_32to8,=20
binop( Iop_And32,=20
- binop(Iop_Shr32, mkexpr(Rs_addr), mkU8(29)),=
=20
+ binop(Iop_Shr32, mkexpr(Rs), mkU8(29)),=20
mkU32(1)) )=20
- );
- IRStmt_Put(=20
+ ));
+ stmt(IRStmt_Put(=20
OFFB_XER_BC,=20
unop( Iop_32to8,=20
- binop( Iop_And32, mkexpr(Rs_addr), mkU32(0xFF)) )
- );
+ binop( Iop_And32, mkexpr(Rs), mkU32(0xFF)) )
+ ));
break;
case 0x8:
DIP("mtlr r%d\n", Rs_addr);
|
|
From: Julian S. <js...@ac...> - 2005-07-21 15:50:45
|
> vex x86->IR: unhandled instruction bytes: 0xF8 0x2A
> 0x7 0x8B
Fixed in vex r1284. The attached test program should now
work properly.
What is the current state of valgrind-3 on x86-solaris?
J
#include <stdio.h>
int x0, x1, x2, x3, x4;
extern void foo ( void );
asm("\n"
".global foo\n"
"foo:\n"
"\txorl %eax,%eax\n"
"\tpushfl\n"
"\tpopl x0\n"
"\tstc\n"
"\tpushfl\n"
"\tpopl x1\n"
"\tclc\n"
"\tpushfl\n"
"\tpopl x2\n"
"\tcmc\n"
"\tpushfl\n"
"\tpopl x3\n"
"\tcmc\n"
"\tpushfl\n"
"\tpopl x4\n"
"\tret\n"
);
int main ( void )
{
const int M = 0xFFFF; /* don't want to see the ID flag, bit 21 */
foo();
printf("0x%x 0x%x 0x%x 0x%x 0x%x\n", x0&M, x1&M, x2&M, x3&M, x4&M);
return 0;
}
|
|
From: <sv...@va...> - 2005-07-21 15:25:42
|
Author: tom
Date: 2005-07-21 16:25:04 +0100 (Thu, 21 Jul 2005)
New Revision: 4222
Log:
Add some more intercept rules for ld.so on amd64.
Modified:
trunk/memcheck/mac_replace_strmem.c
Modified: trunk/memcheck/mac_replace_strmem.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/memcheck/mac_replace_strmem.c 2005-07-21 11:49:24 UTC (rev 4221=
)
+++ trunk/memcheck/mac_replace_strmem.c 2005-07-21 15:25:04 UTC (rev 4222=
)
@@ -161,6 +161,7 @@
// Apparently index() is the same thing as strchr()
STRCHR(m_libc_so_6, strchr)
STRCHR(m_ld_linux_so_2, strchr)
+STRCHR(m_ld_linux_x86_64_so_2, strchr)
STRCHR(m_libc_so_6, index)
STRCHR(m_ld_linux_so_2, index)
STRCHR(m_ld_linux_x86_64_so_2, index)
@@ -441,8 +442,9 @@
return dst; \
}
=20
-STPCPY(m_libc_so_6, stpcpy)
-STPCPY(m_ld_linux_so_2, stpcpy)
+STPCPY(m_libc_so_6, stpcpy)
+STPCPY(m_ld_linux_so_2, stpcpy)
+STPCPY(m_ld_linux_x86_64_so_2, stpcpy)
=20
=20
#define MEMSET(soname, fnname) \
|
|
From: Ashley P. <as...@qu...> - 2005-07-21 15:08:18
|
Hi,
I've just been testing valgrind against our software (parallel MPI
librarys). The valgrind 3 branch just works(TM) which is a good
thing :) I have seen it running before but never quite as easily.
I do however have a couple of requests, one of the problems with
debugging parallel applications is you tend to get drowned in
information as everything is repeated N times (N may be multi thousand
and is often in the hundreds).
I'm trying to write a perl script to post-process the valgrind log files
to compress the output somewhat (there is precadent for this, I've got
some hierarchical stack trace generation code which is very similar).
A working cut of the code is attached, basically it splits each error
report out from the log files and makes a record of which processes saw
that error. It then prints out the process list and the error for every
error encountered anywhere during the job. Because most errors are seen
on multiple processes you should see a big win in the amount of data the
user has to sift through. Thats the plan anyway and it does appear to
be working.
The downside to this approach is you tend to lose context of what order
errors occour in and currently if you see the same error twice it only
gets reported once. There isn't much I can do about the first but the
second is something for me to work on. Current thinking is it's going
to report errors in order for all errors that occoured in process 0,
then all errors that occoured in process 1 but not 0 and so on.
Typical (trucated) output from the script is:
----------------
0
----------------
ERROR SUMMARY: 52 errors from 17 contexts (suppressed: 25 from 1)
malloc/free: in use at exit: 1698968 bytes in 287 blocks.
malloc/free: 419 allocs, 132 frees, 1885866 bytes allocated.
For counts of detected errors, rerun with: -v
searching for pointers to 287 not-freed blocks.
checked 3165336 bytes.
----------------
[0-1,5,7]
----------------
Invalid read of size 4
at 0x1B9B42BA: elan_createBalancedTree (common/groupUtil.c:1228)
by 0x1B984463: _elan_groupInit (elan4/group.c:663)
by 0x1B9871A0: elan_groupInit (elan4/group.c:1320)
by 0x1B99E7DF: base_allGroupInit (common/base.c:474)
by 0x1B99E98F: base_allGroupAlloc (common/base.c:552)
by 0x1B99EEEA: elan_baseInit (common/base.c:778)
by 0x1B9109B3: MPID_Init (adi2init.c:317)
by 0x1B92A44F: MPIR_Init (initutil.c:170)
by 0x1B929632: MPI_Init (init.c:163)
by 0x8048B81: main (in /usr/lib/mpi/mpi_gnu/bin/mping)
Address 0x2CBD5128 is 0 bytes after a block of size 16 alloc'd
at 0x1B8FC9B9: malloc (vg_replace_malloc.c:149)
by 0x1B9B2D64: _elan_gscCreate (common/groupUtil.c:461)
by 0x1B9B27A4: _elan_groupGlCreate (common/groupUtil.c:130)
by 0x1B983C8C: _elan_groupInit (elan4/group.c:454)
by 0x1B9871A0: elan_groupInit (elan4/group.c:1320)
by 0x1B99E7DF: base_allGroupInit (common/base.c:474)
by 0x1B99E98F: base_allGroupAlloc (common/base.c:552)
by 0x1B99EEEA: elan_baseInit (common/base.c:778)
by 0x1B9109B3: MPID_Init (adi2init.c:317)
by 0x1B92A44F: MPIR_Init (initutil.c:170)
by 0x1B929632: MPI_Init (init.c:163)
by 0x8048B81: main (in /usr/lib/mpi/mpi_gnu/bin/mping)
----------------
[0-7]
----------------
Invalid read of size 4
at 0x1B9B4365: elan_createBalancedTree (common/groupUtil.c:1243)
by 0x1B984463: _elan_groupInit (elan4/group.c:663)
by 0x1B9871A0: elan_groupInit (elan4/group.c:1320)
by 0x1B99E7DF: base_allGroupInit (common/base.c:474)
by 0x1B99E98F: base_allGroupAlloc (common/base.c:552)
by 0x1B99EEEA: elan_baseInit (common/base.c:778)
by 0x1B9109B3: MPID_Init (adi2init.c:317)
by 0x1B92A44F: MPIR_Init (initutil.c:170)
by 0x1B929632: MPI_Init (init.c:163)
by 0x8048B81: main (in /usr/lib/mpi/mpi_gnu/bin/mping)
Address 0x2CBD5128 is 0 bytes after a block of size 16 alloc'd
at 0x1B8FC9B9: malloc (vg_replace_malloc.c:149)
by 0x1B9B2D64: _elan_gscCreate (common/groupUtil.c:461)
by 0x1B9B27A4: _elan_groupGlCreate (common/groupUtil.c:130)
by 0x1B983C8C: _elan_groupInit (elan4/group.c:454)
by 0x1B9871A0: elan_groupInit (elan4/group.c:1320)
by 0x1B99E7DF: base_allGroupInit (common/base.c:474)
by 0x1B99E98F: base_allGroupAlloc (common/base.c:552)
by 0x1B99EEEA: elan_baseInit (common/base.c:778)
by 0x1B9109B3: MPID_Init (adi2init.c:317)
by 0x1B92A44F: MPIR_Init (initutil.c:170)
by 0x1B929632: MPI_Init (init.c:163)
by 0x8048B81: main (in /usr/lib/mpi/mpi_gnu/bin/mping)
In my sample case (eight process ping-pong) once passed through this
script the lines of output are reduced from 5102 to 1070 and if I remove
the multiple headers/footers (leaving one of each) this is reduced
further to 899 lines.
stratumi:V> wc -l *
693 valgrind.out.0.pid21666
631 valgrind.out.1.pid21667
636 valgrind.out.2.pid23039
617 valgrind.out.3.pid23040
650 valgrind.out.4.pid26916
618 valgrind.out.5.pid26917
639 valgrind.out.6.pid21641
618 valgrind.out.7.pid21642
5102 total
stratumi:V> qsw_v_read valgri* | wc -l
1070
So far so good, it's work in progress but is showing promise.
I run my programs as prun -n8 valgrind --log-file=valgrind.out
--log-file-qualifier=RMS_RANK mping
Now for my requests
1) would it be possible to drop the .pid<pid> suffix if
--log-file-qualifier is set, there seems little point in having two
qualifiers and if automating this process having as little ambiguity
over filenames as possible seems a good thing.
2) Can you put the qualifier in the logfile somewhere, maybe not in
place of ==<pid>== but possibly in the header, something like:
==21666== My PID = 21666, parent PID = 21664, qualifier = 0.
==21666== Prog and args are:
==21666== /usr/lib/mpi/mpi_gnu/bin/mping
==21666== For more details, rerun with: -v
Whilst this isn't strictly necessairy for the what I've described (I
currently get it from the filenames) at some point I intend to try using
a listener process instead of files.
The perl used is attached, ignore the first three functions, they are
lifted from dshbak and just do the process list to spec conversion.
Ashley,
|
|
From: Rich C. <Ric...@me...> - 2005-07-21 14:57:08
|
I'm building V 3.0.0 on x86 FC3 like system and I'm getting 83 failures in from the test framework. 71 of 73 errors are definitely from here: + Conditional jump or move depends on uninitialised value(s) + at 0x........: index (in /lib/ld-2.3.5.so) + by 0x........: map_doit (in /lib/ld-2.3.5.so) + by 0x........: _dl_catch_error (in /lib/ld-2.3.5.so) + by 0x........: dl_main (in /lib/ld-2.3.5.so) + by 0x........: _dl_sysdep_start (in /lib/ld-2.3.5.so) + by 0x........: _dl_start (in /lib/ld-2.3.5.so) == 181 tests, 83 stderr failures, 2 stdout failures ================= memcheck/tests/addressable (stderr) memcheck/tests/badaddrvalue (stderr) memcheck/tests/badfree-2trace (stderr) memcheck/tests/badfree (stderr) memcheck/tests/badjump (stderr) memcheck/tests/badjump2 (stderr) memcheck/tests/badloop (stderr) memcheck/tests/badpoll (stderr) memcheck/tests/badrw (stderr) memcheck/tests/brk (stderr) memcheck/tests/brk2 (stderr) memcheck/tests/buflen_check (stderr) memcheck/tests/clientperm (stderr) [...] -- Rich Coe ric...@me... General Electric Healthcare Technologies Global Software Platforms, Computer Technology Team |
|
From: <sv...@va...> - 2005-07-21 14:48:48
|
Author: sewardj
Date: 2005-07-21 15:48:31 +0100 (Thu, 21 Jul 2005)
New Revision: 1285
Log:
Do all ppc32 flag calculations in-line, partly for performance reasons
and partly to try and avoid confusing memcheck so much.
Modified:
trunk/priv/guest-ppc32/gdefs.h
trunk/priv/guest-ppc32/toIR.c
trunk/priv/host-ppc32/isel.c
Modified: trunk/priv/guest-ppc32/gdefs.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/guest-ppc32/gdefs.h 2005-07-21 10:07:13 UTC (rev 1284)
+++ trunk/priv/guest-ppc32/gdefs.h 2005-07-21 14:48:31 UTC (rev 1285)
@@ -111,19 +111,18 @@
Enumeration for xer_ca/ov calculation helper functions
*/
enum {
- PPC32G_FLAG_OP_ADD=3D0, // addc[o], addic
- PPC32G_FLAG_OP_ADDE, // adde[o], addme[o], addze[o]
- PPC32G_FLAG_OP_DIVW, // divwo
- PPC32G_FLAG_OP_DIVWU, // divwuo
- PPC32G_FLAG_OP_MULLW, // mullwo
- PPC32G_FLAG_OP_NEG, // nego
- PPC32G_FLAG_OP_SUBF, // subfo
- PPC32G_FLAG_OP_SUBFC, // subfc[o]
- PPC32G_FLAG_OP_SUBFE, // subfe[o], subfme[o], subfze[o]
- PPC32G_FLAG_OP_SUBFI, // subfic
- PPC32G_FLAG_OP_SRAW, // sraw
- PPC32G_FLAG_OP_SRAWI, // srawi
- =20
+ /* 0 */ PPC32G_FLAG_OP_ADD=3D0, // addc[o], addic
+ /* 1 */ PPC32G_FLAG_OP_ADDE, // adde[o], addme[o], addze[o]
+ /* 2 */ PPC32G_FLAG_OP_DIVW, // divwo
+ /* 3 */ PPC32G_FLAG_OP_DIVWU, // divwuo
+ /* 4 */ PPC32G_FLAG_OP_MULLW, // mullwo
+ /* 5 */ PPC32G_FLAG_OP_NEG, // nego
+ /* 6 */ PPC32G_FLAG_OP_SUBF, // subfo
+ /* 7 */ PPC32G_FLAG_OP_SUBFC, // subfc[o]
+ /* 8 */ PPC32G_FLAG_OP_SUBFE, // subfe[o], subfme[o], subfze[o]
+ /* 9 */ PPC32G_FLAG_OP_SUBFI, // subfic
+ /* 10 */ PPC32G_FLAG_OP_SRAW, // sraw
+ /* 11 */ PPC32G_FLAG_OP_SRAWI, // srawi
PPC32G_FLAG_OP_NUMBER
};
=20
Modified: trunk/priv/guest-ppc32/toIR.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/guest-ppc32/toIR.c 2005-07-21 10:07:13 UTC (rev 1284)
+++ trunk/priv/guest-ppc32/toIR.c 2005-07-21 14:48:31 UTC (rev 1285)
@@ -127,7 +127,9 @@
#define OFFB_CTR offsetof(VexGuestPPC32State,guest_CTR)
=20
#define OFFB_XER_SO offsetof(VexGuestPPC32State,guest_XER_SO)
+#define OFFB_XER_OV offsetof(VexGuestPPC32State,guest_XER_OV)
#define OFFB_XER_CA offsetof(VexGuestPPC32State,guest_XER_CA)
+#define OFFB_XER_BC offsetof(VexGuestPPC32State,guest_XER_BC)
=20
#define OFFB_FPROUND offsetof(VexGuestPPC32State,guest_FPROUND)
=20
@@ -392,7 +394,24 @@
return IRExpr_Load(Iend_BE,ty,data);
}
=20
+static IRExpr* mkOR1 ( IRExpr* arg1, IRExpr* arg2 )
+{
+ vassert(typeOfIRExpr(irbb->tyenv, arg1) =3D=3D Ity_I1);
+ vassert(typeOfIRExpr(irbb->tyenv, arg2) =3D=3D Ity_I1);
+ return
+ unop(Iop_32to1, binop(Iop_Or32, unop(Iop_1Uto32, arg1),=20
+ unop(Iop_1Uto32, arg2)));
+}
=20
+static IRExpr* mkAND1 ( IRExpr* arg1, IRExpr* arg2 )
+{
+ vassert(typeOfIRExpr(irbb->tyenv, arg1) =3D=3D Ity_I1);
+ vassert(typeOfIRExpr(irbb->tyenv, arg2) =3D=3D Ity_I1);
+ return
+ unop(Iop_32to1, binop(Iop_And32, unop(Iop_1Uto32, arg1),=20
+ unop(Iop_1Uto32, arg2)));
+}
+
static Int integerGuestRegOffset ( UInt archreg )
{
vassert(archreg < 32);
@@ -898,7 +917,7 @@
/* Set the CR0 flags following an arithmetic operation.
(Condition Register CR0 Field Definition, PPC32 p60)
*/
-static void setFlags_CR0 ( IRExpr* result )
+static void set_CR0 ( IRExpr* result )
{
vassert(typeOfIRExpr(irbb->tyenv,result) =3D=3D Ity_I32);
putCR321( 0, unop(Iop_32to8,
@@ -906,22 +925,128 @@
putCR0( 0, getXER_SO() );
}
=20
-//zz static void setFlags_XER_OV_SO( UInt op, IRExpr* res,
-//zz IRExpr* argL, IRExpr* argR )
-//zz {
-//zz IRExpr* xer_ov;
-//zz vassert(op < PPC32G_FLAG_OP_NUMBER);
-//zz vassert(typeOfIRExpr(irbb->tyenv,res) =3D=3D Ity_I32);
-//zz vassert(typeOfIRExpr(irbb->tyenv,argL) =3D=3D Ity_I32);
-//zz vassert(typeOfIRExpr(irbb->tyenv,argR) =3D=3D Ity_I32);
-//zz=20
-//zz // =3D> Calculate result immediately
-//zz xer_ov =3D mk_ppc32g_calculate_xer_ov(op, res, argL, argR);
-//zz=20
-//zz putReg_bit( PPC32_SPR_XER, xer_ov, SHIFT_XER_OV );
-//zz putReg_bit( PPC32_SPR_XER, xer_ov, SHIFT_XER_SO );
-//zz }
=20
+/* RES is the result of doing OP on ARGL and ARGR. Set %XER.OV and
+ %XER.SO accordingly. */
+
+static void set_XER_OV( UInt op, IRExpr* res,
+ IRExpr* argL, IRExpr* argR )
+{
+ IRTemp t64;
+ IRExpr* xer_ov;
+ vassert(op < PPC32G_FLAG_OP_NUMBER);
+ vassert(typeOfIRExpr(irbb->tyenv,res) =3D=3D Ity_I32);
+ vassert(typeOfIRExpr(irbb->tyenv,argL) =3D=3D Ity_I32);
+ vassert(typeOfIRExpr(irbb->tyenv,argR) =3D=3D Ity_I32);
+
+# define INT32_MIN 0x80000000
+
+# define XOR2(_aa,_bb) \
+ binop(Iop_Xor32,(_aa),(_bb))
+
+# define XOR3(_cc,_dd,_ee) \
+ binop(Iop_Xor32,binop(Iop_Xor32,(_cc),(_dd)),(_ee))
+
+# define AND3(_ff,_gg,_hh) \
+ binop(Iop_And32,binop(Iop_And32,(_ff),(_gg)),(_hh))
+
+#define NOT(_jj) \
+ unop(Iop_Not32, (_jj))
+
+ switch (op) {
+
+ case /* 0 */ PPC32G_FLAG_OP_ADD:
+ case /* 1 */ PPC32G_FLAG_OP_ADDE:
+ /* (argL^argR^-1) & (argL^res) & (1<<31) ?1:0 */
+ // i.e. ((both_same_sign) & (sign_changed) & (sign_mask))
+ xer_ov=20
+ =3D AND3( XOR3(argL,argR,mkU32(-1)),
+ XOR2(argL,res),
+ mkU32(INT32_MIN) );
+ /* xer_ov can only be 0 or 1<<31 */
+ xer_ov=20
+ =3D binop(Iop_Shr32, xer_ov, mkU8(31) );
+ break;
+
+ case /* 2 */ PPC32G_FLAG_OP_DIVW:
+ /* (argL =3D=3D INT32_MIN && argR =3D=3D -1) || argR =3D=3D 0 *=
/
+ xer_ov
+ =3D mkOR1(
+ mkAND1(=20
+ binop(Iop_CmpEQ32, argL, mkU32(INT32_MIN)),
+ binop(Iop_CmpEQ32, argR, mkU32(-1))=20
+ ),
+ binop(Iop_CmpEQ32, argR, mkU32(0) )=20
+ );
+ xer_ov=20
+ =3D unop(Iop_1Uto32, xer_ov);
+ break;
+
+ case /* 3 */ PPC32G_FLAG_OP_DIVWU:
+ /* argR =3D=3D 0 */
+ xer_ov=20
+ =3D unop(Iop_1Uto32, binop(Iop_CmpEQ32, argR, mkU32(0)));
+ break;
+
+ case /* 4 */ PPC32G_FLAG_OP_MULLW:
+ /* OV true if result can't be represented in 32 bits
+ i.e sHi !=3D sign extension of sLo */
+ t64 =3D newTemp(Ity_I64);
+ assign( t64, binop(Iop_MullU32, argL, argR) );
+ xer_ov=20
+ =3D binop( Iop_CmpNE32,
+ unop(Iop_64HIto32, mkexpr(t64)),
+ binop( Iop_Sar32,=20
+ unop(Iop_64to32, mkexpr(t64)),=20
+ mkU8(31))
+ );
+ xer_ov
+ =3D unop(Iop_1Uto32, xer_ov);
+ break;
+
+ case /* 5 */ PPC32G_FLAG_OP_NEG:
+ /* argL =3D=3D INT32_MIN */
+ xer_ov
+ =3D unop( Iop_1Uto32,=20
+ binop(Iop_CmpEQ32, argL, mkU32(INT32_MIN)) );
+ break;
+
+ case /* 6 */ PPC32G_FLAG_OP_SUBF:
+ case /* 7 */ PPC32G_FLAG_OP_SUBFC:
+ case /* 8 */ PPC32G_FLAG_OP_SUBFE:
+ /* ((~argL)^argR^-1) & ((~argL)^res) & (1<<31) ?1:0; */
+ xer_ov=20
+ =3D AND3( XOR3(NOT(argL),argR,mkU32(-1)),
+ XOR2(NOT(argL),res),
+ mkU32(INT32_MIN) );
+ /* xer_ov can only be 0 or 1<<31 */
+ xer_ov=20
+ =3D binop(Iop_Shr32, xer_ov, mkU8(31) );
+ break;
+
+ default:=20
+ vex_printf("set_XER_OV: op =3D %d\n", op);
+ vpanic("set_XER_OV(ppc32)");
+ }
+=20
+ /* xer_ov MUST denote either 0 or 1, no other value allowed */
+ stmt( IRStmt_Put( OFFB_XER_OV, unop(Iop_32to8, xer_ov) ) );
+
+ /* Update the summary overflow */
+ stmt( IRStmt_Put(=20
+ OFFB_XER_SO,
+ binop(Iop_Or8, IRExpr_Get( OFFB_XER_SO, Ity_I8 ),
+ IRExpr_Get( OFFB_XER_OV, Ity_I8 ) )
+ ));
+
+# undef INT32_MIN
+# undef AND3
+# undef XOR3
+# undef XOR2
+# undef NOT
+}
+
+
/* RES is the result of doing OP on ARGL and ARGR with the old %XER.CA
value being OLDCA. Set %XER.CA accordingly. */
=20
@@ -938,13 +1063,111 @@
vassert(typeOfIRExpr(irbb->tyenv,argR) =3D=3D Ity_I32);
vassert(typeOfIRExpr(irbb->tyenv,oldca) =3D=3D Ity_I32);
=20
- // Use a helper to calculate xer_ca. Assumes that the
- // helper returns either 1 or 0, which is true because
- // mk_ppc32g_calculate_xer_ca masks the value appropriately.
- xer_ca =3D mk_ppc32g_calculate_xer_ca(op, res, argL, argR, oldca );
- xer_ca =3D unop(Iop_32to8, xer_ca);
+ /* Incoming oldca is assumed to hold the values 0 or 1 only. This
+ seems reasonable given that it's always generated by
+ get_XER_CA(), which masks it accordingly. In any case it being
+ 0 or 1 is an invariant of the ppc32 guest state representation;
+ if it has any other value, that invariant has been violated. */
=20
- stmt( IRStmt_Put( OFFB_XER_CA, xer_ca ) );
+ switch (op) {
+
+ case /* 0 */ PPC32G_FLAG_OP_ADD:
+ /* res <u argL */
+ xer_ca
+ =3D unop(Iop_1Uto32, binop(Iop_CmpLT32U, res, argL));
+ break;
+
+ case /* 1 */ PPC32G_FLAG_OP_ADDE:
+ /* res <u argL || (old_ca=3D=3D1 && res=3D=3DargL) */
+ xer_ca=20
+ =3D mkOR1(=20
+ binop(Iop_CmpLT32U, res, argL),
+ mkAND1(=20
+ binop(Iop_CmpEQ32, oldca, mkU32(1)),
+ binop(Iop_CmpEQ32, res, argL)=20
+ )=20
+ );
+ xer_ca=20
+ =3D unop(Iop_1Uto32, xer_ca);
+ break;
+
+ case /* 8 */ PPC32G_FLAG_OP_SUBFE:
+ /* res <u argR || (old_ca=3D=3D1 && res=3D=3DargR) */
+ xer_ca=20
+ =3D mkOR1(=20
+ binop(Iop_CmpLT32U, res, argR),
+ mkAND1(=20
+ binop(Iop_CmpEQ32, oldca, mkU32(1)),
+ binop(Iop_CmpEQ32, res, argR)=20
+ )=20
+ );
+ xer_ca=20
+ =3D unop(Iop_1Uto32, xer_ca);
+ break;
+
+ case /* 7 */ PPC32G_FLAG_OP_SUBFC:
+ case /* 9 */ PPC32G_FLAG_OP_SUBFI:
+ /* res <=3Du argR */
+ xer_ca
+ =3D unop(Iop_1Uto32, binop(Iop_CmpLE32U, res, argR));
+ break;
+
+ case /* 10 */ PPC32G_FLAG_OP_SRAW:
+ /* The shift amount is guaranteed to be in 0 .. 63 inclusive.
+ If it is <=3D 31, behave like SRAWI; else XER.CA is the sign
+ bit of argL. */
+ /* This term valid for shift amount < 32 only */
+ xer_ca
+ =3D binop(
+ Iop_And32,
+ binop(Iop_Sar32, argL, mkU8(31)),
+ binop( Iop_And32,
+ argL,
+ binop( Iop_Sub32,
+ binop(Iop_Shl32, mkU32(1), unop(Iop_32to8=
,argR)),
+ mkU32(1) )
+ )
+ );
+ xer_ca=20
+ =3D IRExpr_Mux0X(
+ /* shift amt > 31 ? */
+ unop(Iop_1Uto8, binop(Iop_CmpLT32U, mkU32(31), argR)),
+ /* no -- be like srawi */
+ unop(Iop_1Uto32, binop(Iop_CmpNE32, xer_ca, mkU32(0))),
+ /* yes -- get sign bit of argL */
+ binop(Iop_Shr32, argL, mkU8(31))
+ );
+ break;
+
+ case /* 11 */ PPC32G_FLAG_OP_SRAWI:
+ /* xer_ca is 1 iff src was negative and bits_shifted_out !=3D=20
+ 0. Since the shift amount is known to be in the range
+ 0 .. 31 inclusive the following seems viable:
+ xer.ca =3D=3D 1 iff the following is nonzero:
+ (argL >>s 31) -- either all 0s or all 1s
+ & (argL & (1<<argR)-1) -- the stuff shifted out */
+ xer_ca
+ =3D binop(
+ Iop_And32,
+ binop(Iop_Sar32, argL, mkU8(31)),
+ binop( Iop_And32,
+ argL,
+ binop( Iop_Sub32,
+ binop(Iop_Shl32, mkU32(1), unop(Iop_32to8=
,argR)),
+ mkU32(1) )
+ )
+ );
+ xer_ca=20
+ =3D unop(Iop_1Uto32, binop(Iop_CmpNE32, xer_ca, mkU32(0)));
+ break;
+
+ default:=20
+ vex_printf("set_XER_CA: op =3D %d\n", op);
+ vpanic("set_XER_CA(ppc32)");
+ }
+
+ /* xer_ca MUST denote either 0 or 1, no other value allowed */
+ stmt( IRStmt_Put( OFFB_XER_CA, unop(Iop_32to8, xer_ca) ) );
}
=20
static IRExpr* /* :: Ity_I32 */ get_XER_CA ( void )
@@ -1374,9 +1597,8 @@
Rd_addr, Ra_addr, Rb_addr);
assign( Rd, binop(Iop_Add32, mkexpr(Ra), mkexpr(Rb)) );
if (flag_OE) {
-vassert(0);
-// flag_op =3D PPC32G_FLAG_OP_ADD;
-// setFlags_XER_OV_SO( flag_op, mkexpr(Rd), mkexpr(Ra), mkexp=
r(Rb) );
+ set_XER_OV( PPC32G_FLAG_OP_ADD,
+ mkexpr(Rd), mkexpr(Ra), mkexpr(Rb) );
}
break;
=20
@@ -1389,8 +1611,8 @@
mkexpr(Rd), mkexpr(Ra), mkexpr(Rb),
mkU32(0)/*old xer.ca, which is ignored*/ );
if (flag_OE) {
-vassert(0);
-// setFlags_XER_OV_SO( flag_op, mkexpr(Rd), mkexpr(Ra), mkexp=
r(Rb) );
+ set_XER_OV( PPC32G_FLAG_OP_ADD,=20
+ mkexpr(Rd), mkexpr(Ra), mkexpr(Rb) );
}
break;
=20
@@ -1407,8 +1629,8 @@
mkexpr(Rd), mkexpr(Ra), mkexpr(Rb),
mkexpr(old_xer_ca) );
if (flag_OE) {
-vassert(0);
-// setFlags_XER_OV_SO( flag_op, mkexpr(Rd), mkexpr(Ra), mkexp=
r(Rb) );
+ set_XER_OV( PPC32G_FLAG_OP_ADDE,=20
+ mkexpr(Rd), mkexpr(Ra), mkexpr(Rb) );
}
break;
}
@@ -1431,8 +1653,8 @@
mkexpr(Rd), mkexpr(Ra), mkU32(-1),
mkexpr(old_xer_ca) );
if (flag_OE) {
-vassert(0);
-// setFlags_XER_OV_SO( flag_op, mkexpr(Rd), mkexpr(Ra), mkU32=
(-1) );
+ set_XER_OV( PPC32G_FLAG_OP_ADDE,=20
+ mkexpr(Rd), mkexpr(Ra), mkU32(-1) );
}
break;
}
@@ -1454,8 +1676,8 @@
mkexpr(Rd), mkexpr(Ra), mkU32(0),=20
mkexpr(old_xer_ca) );
if (flag_OE) {
-vassert(0);
-// setFlags_XER_OV_SO( flag_op, mkexpr(Rd), mkexpr(Ra), mkU32=
(0) );
+ set_XER_OV( PPC32G_FLAG_OP_ADDE,=20
+ mkexpr(Rd), mkexpr(Ra), mkU32(0) );
}
break;
}
@@ -1466,9 +1688,8 @@
Rd_addr, Ra_addr, Rb_addr);
assign( Rd, binop(Iop_DivS32, mkexpr(Ra), mkexpr(Rb)) );
if (flag_OE) {
-vassert(0);
-// flag_op =3D PPC32G_FLAG_OP_DIVW;
-// setFlags_XER_OV_SO( flag_op, mkexpr(Rd), mkexpr(Ra), mkexp=
r(Rb) );
+ set_XER_OV( PPC32G_FLAG_OP_DIVW,=20
+ mkexpr(Rd), mkexpr(Ra), mkexpr(Rb) );
}
/* Note:
if (0x8000_0000 / -1) or (x / 0)
@@ -1482,9 +1703,8 @@
Rd_addr, Ra_addr, Rb_addr);
assign( Rd, binop(Iop_DivU32, mkexpr(Ra), mkexpr(Rb)) );
if (flag_OE) {
-vassert(0);
-// flag_op =3D PPC32G_FLAG_OP_DIVWU;
-// setFlags_XER_OV_SO( flag_op, mkexpr(Rd), mkexpr(Ra), mkexp=
r(Rb) );
+ set_XER_OV( PPC32G_FLAG_OP_DIVWU,=20
+ mkexpr(Rd), mkexpr(Ra), mkexpr(Rb) );
}
/* Note: ditto comment divw, for (x / 0) */
break;
@@ -1518,9 +1738,8 @@
assign( res64, binop(Iop_MullU32, mkexpr(Ra), mkexpr(Rb)) );
assign( Rd, unop(Iop_64to32, mkexpr(res64)) );
if (flag_OE) {
- vassert(0);
- // flag_op =3D PPC32G_FLAG_OP_MULLW;
- // setFlags_XER_OV_SO( flag_op, mkexpr(Rd), mkexpr(Ra), mkex=
pr(Rb) );
+ set_XER_OV( PPC32G_FLAG_OP_MULLW,=20
+ mkexpr(Rd), mkexpr(Ra), mkexpr(Rb) );
}
break;
=20
@@ -1536,9 +1755,8 @@
assign( Rd, binop(Iop_Add32,
unop(Iop_Not32, mkexpr(Ra)), mkU32(1)) );
if (flag_OE) {
-vassert(0);
-// flag_op =3D PPC32G_FLAG_OP_NEG;
-// setFlags_XER_OV_SO( flag_op, mkexpr(Rd), mkexpr(Ra), mkexp=
r(Rb) );
+ set_XER_OV( PPC32G_FLAG_OP_NEG,=20
+ mkexpr(Rd), mkexpr(Ra), mkexpr(Rb) );
}
break;
=20
@@ -1549,9 +1767,8 @@
// rD =3D rB - rA
assign( Rd, binop(Iop_Sub32, mkexpr(Rb), mkexpr(Ra)) );
if (flag_OE) {
-vassert(0);
-// flag_op =3D PPC32G_FLAG_OP_SUBF;
-// setFlags_XER_OV_SO( flag_op, mkexpr(Rd), mkexpr(Ra), mkexp=
r(Rb) );
+ set_XER_OV( PPC32G_FLAG_OP_SUBF,=20
+ mkexpr(Rd), mkexpr(Ra), mkexpr(Rb) );
}
break;
=20
@@ -1565,8 +1782,8 @@
mkexpr(Rd), mkexpr(Ra), mkexpr(Rb),
mkU32(0)/*old xer.ca, which is ignored*/ );
if (flag_OE) {
-vassert(0);
-// setFlags_XER_OV_SO( flag_op, mkexpr(Rd), mkexpr(Ra), mkexp=
r(Rb) );
+ set_XER_OV( PPC32G_FLAG_OP_SUBFC,=20
+ mkexpr(Rd), mkexpr(Ra), mkexpr(Rb) );
}
break;
=20
@@ -1583,31 +1800,36 @@
mkexpr(Rd), mkexpr(Ra), mkexpr(Rb),=20
mkexpr(old_xer_ca) );
if (flag_OE) {
- vassert(0);
-// setFlags_XER_OV_SO( flag_op, mkexpr(Rd), mkexpr(Ra), mkexp=
r(Rb) );
+ set_XER_OV( PPC32G_FLAG_OP_SUBFE,=20
+ mkexpr(Rd), mkexpr(Ra), mkexpr(Rb) );
}
break;
}
=20
-//zz case 0x0E8: // subfme (Subtract from Minus One Extended, =
PPC32 p541)
-//zz if (Rb_addr !=3D 0) {
-//zz vex_printf("dis_int_arith(PPC32)(subfme,Rb_addr)\n");
-//zz return False;
-//zz }
-//zz DIP("subfme%s%s r%d,r%d\n",
-//zz flag_OE ? "o" : "", flag_Rc ? "." : "",
-//zz Rd_addr, Ra_addr);
-//zz // rD =3D (log not)rA + (-1) + XER[CA]
-//zz // =3D> Just another form of subfe
-//zz assign( Rd, binop(Iop_Add32, unop(Iop_Not32, mkexpr(Ra)),
-//zz binop(Iop_Add32, mkU32(-1), mkexpr(xer_c=
a))) );
-//zz flag_op =3D PPC32G_FLAG_OP_SUBFE;
-//zz setFlags_XER_CA( flag_op, mkexpr(Rd), mkexpr(Ra), mkU32(-1=
) );
-//zz if (flag_OE) {
-//zz setFlags_XER_OV_SO( flag_op, mkexpr(Rd), mkexpr(Ra), mk=
U32(-1) );
-//zz }
-//zz break;
- =20
+ case 0x0E8: { // subfme (Subtract from Minus One Extended, PPC=
32 p541)
+ IRTemp old_xer_ca =3D newTemp(Ity_I32);
+ if (Rb_addr !=3D 0) {
+ vex_printf("dis_int_arith(PPC32)(subfme,Rb_addr)\n");
+ return False;
+ }
+ DIP("subfme%s%s r%d,r%d\n",
+ flag_OE ? "o" : "", flag_Rc ? "." : "",
+ Rd_addr, Ra_addr);
+ // rD =3D (log not)rA + (-1) + XER[CA]
+ // =3D> Just another form of subfe
+ assign( old_xer_ca, get_XER_CA() );
+ assign( Rd, binop(Iop_Add32, unop(Iop_Not32, mkexpr(Ra)),
+ binop(Iop_Add32, mkU32(-1), mkexpr(old_xer_ca=
))) );
+ set_XER_CA( PPC32G_FLAG_OP_SUBFE,
+ mkexpr(Rd), mkexpr(Ra), mkU32(-1),
+ mkexpr(old_xer_ca) );
+ if (flag_OE) {
+ set_XER_OV( PPC32G_FLAG_OP_SUBFE,=20
+ mkexpr(Rd), mkexpr(Ra), mkU32(-1) );
+ }
+ break;
+ }
+
case 0x0C8: { // subfze (Subtract from Zero Extended, PPC32 p5=
42)
IRTemp old_xer_ca =3D newTemp(Ity_I32);
if (Rb_addr !=3D 0) {
@@ -1626,8 +1848,8 @@
mkexpr(Rd), mkexpr(Ra), mkU32(0),=20
mkexpr(old_xer_ca) );
if (flag_OE) {
-vassert(0);
-// setFlags_XER_OV_SO( flag_op, mkexpr(Rd), mkexpr(Ra), mkU32=
(0) );
+ set_XER_OV( PPC32G_FLAG_OP_SUBFE,
+ mkexpr(Rd), mkexpr(Ra), mkU32(0) );
}
break;
}
@@ -1644,7 +1866,7 @@
=20
putIReg( Rd_addr, mkexpr(Rd) );
if (do_rc && flag_Rc) {
- setFlags_CR0( mkexpr(Rd) );
+ set_CR0( mkexpr(Rd) );
}
return True;
}
@@ -1858,12 +2080,12 @@
unop(Iop_Clz32, mkexpr(Rs)) ));
break;
=20
-//zz case 0x11C: // eqv (Equivalent, PPC32 p396)
-//zz DIP("eqv%s r%d,r%d,r%d\n",
-//zz flag_Rc ? "." : "", Ra_addr, Rs_addr, Rb_addr);
-//zz assign( Ra, unop(Iop_Not32, binop(Iop_Xor32,
-//zz mkexpr(Rs), mkexpr(Rb)))=
);
-//zz break;
+ case 0x11C: // eqv (Equivalent, PPC32 p396)
+ DIP("eqv%s r%d,r%d,r%d\n",
+ flag_Rc ? "." : "", Ra_addr, Rs_addr, Rb_addr);
+ assign( Ra, unop(Iop_Not32, binop(Iop_Xor32,
+ mkexpr(Rs), mkexpr(Rb))) );
+ break;
=20
case 0x3BA: // extsb (Extend Sign Byte, PPC32 p397
if (Rb_addr!=3D0) {
@@ -1936,7 +2158,7 @@
=20
putIReg( Ra_addr, mkexpr(Ra) );
if (do_rc && flag_Rc) {
- setFlags_CR0( mkexpr(Ra) );
+ set_CR0( mkexpr(Ra) );
}
return True;
}
@@ -2003,7 +2225,7 @@
=20
putIReg( Ra_addr, mkexpr(Ra) );
if (flag_Rc) {
- setFlags_CR0( mkexpr(Ra) );
+ set_CR0( mkexpr(Ra) );
}
return True;
}
@@ -3112,6 +3334,8 @@
IRTemp Ra =3D newTemp(Ity_I32);
IRTemp Rb =3D newTemp(Ity_I32);
IRTemp mask =3D newTemp(Ity_I32);
+ IRTemp sh_amt32 =3D newTemp(Ity_I32);
+ IRTemp outofrange =3D newTemp(Ity_I8);
=20
assign( Rs, getIReg(Rs_addr) );
assign( Rb, getIReg(Rb_addr) );
@@ -3133,53 +3357,37 @@
DIP("sraw%s r%d,r%d,r%d\n", flag_Rc ? "." : "",
Ra_addr, Rs_addr, Rb_addr);
=20
- assign( sh_amt, binop(Iop_And8, mkU8(0x1F),
- unop(Iop_32to8, mkexpr(Rb))) );
- // Rs_shift =3D Rs >> sh_amt
- assign( Rs_sh, binop(Iop_Shr32, mkexpr(Rs), mkexpr(sh_amt)) );
- // rb_b5 =3D Rb[5]
- assign( rb_b5, binop(Iop_And32, mkexpr(Rb), mkU32(1<<5)) );
- // sign =3D Rs[31]
- assign( sign, binop(Iop_Shr32, mkexpr(Rs), mkU8(31)) );
- // mask =3D rb_b5=3D=3D0 ? (-1 >> sh_amt) : 0
- assign( mask,
- IRExpr_Mux0X( unop(Iop_32to8, mkexpr(rb_b5)),
- binop(Iop_Shr32, mkU32(-1), mkexpr(sh_amt=
)),
- mkU32(0) ));
- // sign_ext =3D sign=3D=3D0 ? 0 : ~mask
- assign( sext, IRExpr_Mux0X( unop(Iop_32to8, mkexpr(sign)),
- mkU32(0),
- unop(Iop_Not32, mkexpr(mask)) ));
- // Rs_msk =3D (Rs_sh & mask)
- assign( Rs_msk, binop(Iop_And32, mkexpr(Rs_sh), mkexpr(mask)) )=
;
- // Ra =3D Rs_msk | sext
- assign( Ra, binop(Iop_Or32, mkexpr(Rs_msk), mkexpr(sext)) );
- flag_op =3D PPC32G_FLAG_OP_SRAW;
- set_XER_CA( flag_op, mkexpr(Ra), mkexpr(Rs), mkexpr(Rb),
- mkU32(0)/*old xer.ca, which is ignored*/ )=
;
+ /* JRS: my reading of the (poorly worded) PPC32 doc p506 is:
+ amt =3D Rb & 63
+ Ra =3D Sar32( Rs, amt > 31 ? 31 : amt )
+ XER.CA =3D amt > 31 ? sign-of-Rs : (computation as per sr=
awi)
+ */
+ assign( sh_amt32, binop(Iop_And32, mkU32(0x3F), mkexpr(Rb)) );
+ assign( outofrange,
+ unop( Iop_1Uto8,=20
+ binop(Iop_CmpLT32U, mkU32(31), mkexpr(sh_amt32)) =
));
+ assign( Ra,
+ binop( Iop_Sar32,=20
+ mkexpr(Rs),=20
+ unop( Iop_32to8,=20
+ IRExpr_Mux0X( mkexpr(outofrange),=20
+ mkexpr(sh_amt32),=20
+ mkU32(31)) ))
+ );
+ set_XER_CA( PPC32G_FLAG_OP_SRAW,
+ mkexpr(Ra), mkexpr(Rs), mkexpr(sh_amt32),
+ get_XER_CA() );
break;
=20
case 0x338: // srawi (Shift Right Algebraic Word Immediate, PPC32 =
p507)
DIP("srawi%s r%d,r%d,%d\n", flag_Rc ? "." : "",
Ra_addr, Rs_addr, sh_imm);
- =20
+ vassert(sh_imm < 32);
assign( sh_amt, mkU8(sh_imm) );
- // Rs_shift =3D Rs >> sh_amt
- assign( Rs_sh, binop(Iop_Shr32, mkexpr(Rs), mkexpr(sh_amt)) );
- // sign =3D Rs[31]
- assign( sign, binop(Iop_And32, mkU32(1),
- binop(Iop_Shr32, mkexpr(Rs), mkU8(31))) );
- // mask =3D (-1 >> sh_amt)
- assign( mask, binop(Iop_Shr32, mkU32(-1), mkexpr(sh_amt)) );
- // sign_ext =3D sign=3D=3D0 ? 0 : ~mask
- assign( sext, IRExpr_Mux0X( unop(Iop_32to8, mkexpr(sign)),
- mkU32(0),
- unop(Iop_Not32, mkexpr(mask)) ));
- // Ra =3D Rs_shift | sext
- assign( Ra, binop(Iop_Or32, mkexpr(sext), mkexpr(Rs_sh)) );
- flag_op =3D PPC32G_FLAG_OP_SRAWI;
- set_XER_CA( flag_op, mkexpr(Ra), mkexpr(Rs), mkU32(sh_imm),=20
- mkU32(0)/*old xer.ca, which is ignored*/ )=
;
+ assign( Ra, binop(Iop_Sar32, mkexpr(Rs), mkexpr(sh_amt)) );
+ set_XER_CA( PPC32G_FLAG_OP_SRAWI,=20
+ mkexpr(Ra), mkexpr(Rs), mkU32(sh_imm),=20
+ get_XER_CA() );
break;
=20
case 0x218: // srw (Shift Right Word, PPC32 p508)
@@ -3205,8 +3413,7 @@
putIReg( Ra_addr, mkexpr(Ra) );
=20
if (flag_Rc) {
-vassert(0);
- // setFlags_CR7( mkexpr(Ra) );
+ set_CR0( mkexpr(Ra) );
}
return True;
}
@@ -3391,7 +3598,46 @@
case 0x153: // mfspr (Move from Special-Purpose Register, PPC32 p470)
=20
switch (SPR_flipped) { // Choose a register...
-//zz case 0x1: putIReg( Rd_addr, getReg( PPC32_SPR_XER ) ); b=
reak;
+
+ case 0x1:
+ DIP("mfxer r%d\n", Rd_addr);
+ /* sheesh [kebab] */
+ putIReg(=20
+ Rd_addr,
+ binop(
+ Iop_Or32,
+ binop(
+ Iop_Or32,
+ binop( Iop_Shl32,=20
+ binop( Iop_And32,=20
+ unop( Iop_8Uto32,=20
+ IRExpr_Get( OFFB_XER_SO, Ity_I8=
)),=20
+ mkU32(1)),=20
+ mkU8(31)),
+ binop( Iop_Shl32,=20
+ binop( Iop_And32,=20
+ unop( Iop_8Uto32,=20
+ IRExpr_Get( OFFB_XER_OV, Ity_I8=
)),=20
+ mkU32(1)),=20
+ mkU8(30))
+ ),
+ binop(
+ Iop_Or32,
+ binop( Iop_Shl32,=20
+ binop( Iop_And32,=20
+ unop( Iop_8Uto32,=20
+ IRExpr_Get( OFFB_XER_CA, Ity_I8=
)),=20
+ mkU32(1)),=20
+ mkU8(29)),
+ binop( Iop_And32,=20
+ unop( Iop_8Uto32,=20
+ IRExpr_Get( OFFB_XER_BC, Ity_I8 )),=20
+ mkU32(0xFF))
+ )
+ )
+ );
+ break;
+
case 0x8:
DIP("mflr r%d\n", Rd_addr);
putIReg( Rd_addr, getSPR( PPC32_SPR_LR ) );=20
@@ -3443,7 +3689,35 @@
case 0x1D3: // mtspr (Move to Special-Purpose Register, PPC32 p483)
=20
switch (SPR_flipped) { // Choose a register...
-//zz case 0x1: putReg( PPC32_SPR_XER, mkexpr(Rs) ); break;
+ case 0x1:
+ DIP("mtxer r%d\n", Rs_addr);
+ IRStmt_Put(=20
+ OFFB_XER_SO,=20
+ unop( Iop_32to8,=20
+ binop( Iop_And32,=20
+ binop(Iop_Shr32, mkexpr(Rs_addr), mkU8(31)),=
=20
+ mkU32(1)) )=20
+ );
+ IRStmt_Put(=20
+ OFFB_XER_OV,=20
+ unop( Iop_32to8,=20
+ binop( Iop_And32,=20
+ binop(Iop_Shr32, mkexpr(Rs_addr), mkU8(30)),=
=20
+ mkU32(1)) )=20
+ );
+ IRStmt_Put(=20
+ OFFB_XER_CA,=20
+ unop( Iop_32to8,=20
+ binop( Iop_And32,=20
+ binop(Iop_Shr32, mkexpr(Rs_addr), mkU8(29)),=
=20
+ mkU32(1)) )=20
+ );
+ IRStmt_Put(=20
+ OFFB_XER_BC,=20
+ unop( Iop_32to8,=20
+ binop( Iop_And32, mkexpr(Rs_addr), mkU32(0xFF)) )
+ );
+ break;
case 0x8:
DIP("mtlr r%d\n", Rs_addr);
putSPR( PPC32_SPR_LR, mkexpr(Rs) );=20
@@ -3515,13 +3789,13 @@
//zz DIP("dcba r%d,r%d\n", Ra_addr, Rb_addr);
//zz if (0) vex_printf("vex ppc32->IR: kludged dcba\n");
//zz break;
-//zz =20
-//zz case 0x056: // dcbf (Data Cache Block Flush, PPC32 p382)
-//zz vassert(0); /* AWAITING TEST CASE */
-//zz DIP("dcbf r%d,r%d\n", Ra_addr, Rb_addr);
-//zz if (0) vex_printf("vex ppc32->IR: kludged dcbf\n");
-//zz break;
=20
+ case 0x056: // dcbf (Data Cache Block Flush, PPC32 p382)
+ DIP("dcbf r%d,r%d\n", Ra_addr, Rb_addr);
+ /* nop as far as vex is concerned */
+ if (0) vex_printf("vex ppc32->IR: kludged dcbf\n");
+ break;
+ =20
case 0x036: // dcbst (Data Cache Block Store, PPC32 p384)
DIP("dcbst r%d,r%d\n", Ra_addr, Rb_addr);
/* nop as far as vex is concerned */
Modified: trunk/priv/host-ppc32/isel.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/host-ppc32/isel.c 2005-07-21 10:07:13 UTC (rev 1284)
+++ trunk/priv/host-ppc32/isel.c 2005-07-21 14:48:31 UTC (rev 1285)
@@ -1537,7 +1537,8 @@
// Make a compare that will always be true:
HReg r_zero =3D newVRegI(env);
addInstr(env, PPC32Instr_LI32(r_zero, 0));
- addInstr(env, PPC32Instr_Cmp32(False/*unsigned*/, /*cr*/7, r_zero,=
PPC32RH_Reg(r_zero)));
+ addInstr(env, PPC32Instr_Cmp32(False/*unsigned*/, /*cr*/7,=20
+ r_zero, PPC32RH_Reg(r_zero)));
return mk_PPCCondCode( Pct_TRUE, Pcf_7EQ );
}
=20
@@ -1567,6 +1568,19 @@
//.. return iselCondCode(env, expr1);
//.. }
=20
+ /* 32to1 */
+ if (e->tag =3D=3D Iex_Unop && e->Iex.Unop.op =3D=3D Iop_32to1) {
+ HReg src =3D iselIntExpr_R(env, e->Iex.Unop.arg);
+ HReg tmp =3D newVRegI(env);
+ /* could do better, probably -- andi. */
+ addInstr(env, PPC32Instr_Alu32(
+ Palu_AND, tmp, src, PPC32RH_Imm(False,1)));
+ addInstr(env, PPC32Instr_Cmp32(
+ False/*unsigned*/, 7/*cr*/,=20
+ tmp, PPC32RH_Imm(False,1)));
+ return mk_PPCCondCode( Pct_TRUE, Pcf_7EQ );
+ }
+
/* --- patterns rooted at: CmpNEZ8 --- */
=20
/* CmpNEZ8(x) */
@@ -1576,7 +1590,8 @@
HReg r_32 =3D iselIntExpr_R(env, e->Iex.Unop.arg);
HReg r_l =3D newVRegI(env);
addInstr(env, PPC32Instr_Alu32(Palu_AND, r_l, r_32, PPC32RH_Imm(Fa=
lse,0xFF)));
- addInstr(env, PPC32Instr_Cmp32(False/*unsigned*/, 7, r_l, PPC32RH_=
Imm(False,0)));
+ addInstr(env, PPC32Instr_Cmp32(False/*unsigned*/, 7/*cr*/,=20
+r_l, PPC32RH_Imm(False,0)));
return mk_PPCCondCode( Pct_FALSE, Pcf_7EQ );
}
=20
@@ -1661,9 +1676,9 @@
case Iop_CmpEQ32: return mk_PPCCondCode( Pct_TRUE, Pcf_7EQ );
case Iop_CmpNE32: return mk_PPCCondCode( Pct_FALSE, Pcf_7EQ );
// case Iop_CmpLT32S: return mk_PPCCondCode( Pct_TRUE, Pcf_LT );
-// case Iop_CmpLT32U: return mk_PPCCondCode( Pct_TRUE, Pcf_LT );
+ case Iop_CmpLT32U: return mk_PPCCondCode( Pct_TRUE, Pcf_7LT );
// case Iop_CmpLE32S: return mk_PPCCondCode( Pct_FALSE, Pcf_GT );
-// case Iop_CmpLE32U: return mk_PPCCondCode( Pct_FALSE, Pcf_GT );
+ case Iop_CmpLE32U: return mk_PPCCondCode( Pct_FALSE, Pcf_7GT );
default: vpanic("iselCondCode(ppc32): CmpXX32");
}
}
|
|
From: Nicholas N. <nj...@cs...> - 2005-07-21 13:00:10
|
On Thu, 21 Jul 2005, Julian Seward wrote: > My only reservation is that the output is a bit verbose. At > a minimum, could we have the current results first, and then the > 24-h results, and then the diff? So I don't have to scroll down > in kmail to see the most recent results. Ok, I'll change it. > Ideally I was hoping for the following, but perhaps it's a bit > much as I realise this would involve extracting the relevant > parts of the short logfiles, which isn't obvious how to do. > (note: the implication is I don't really care about the 24-h > ago build results, which is true). It also assumes that we got as far as the regtests. Sometimes building (or even checking out) fails. Remember that most of the time the results will be the same as the previous day's, so the more verbose output will be the exception. N |
|
From: <sv...@va...> - 2005-07-21 11:49:44
|
Author: tom
Date: 2005-07-21 12:49:24 +0100 (Thu, 21 Jul 2005)
New Revision: 4221
Log:
Allow negative sizes for structure members in stabs. Fixed bug #109385.
Modified:
trunk/coregrind/m_debuginfo/stabs.c
Modified: trunk/coregrind/m_debuginfo/stabs.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/coregrind/m_debuginfo/stabs.c 2005-07-20 17:48:18 UTC (rev 4220=
)
+++ trunk/coregrind/m_debuginfo/stabs.c 2005-07-21 11:49:24 UTC (rev 4221=
)
@@ -935,7 +935,11 @@
=20
if (*p =3D=3D ',') {
EXPECT(',', "struct OFFSET");
- sz =3D atou(&p, 0);
+
+ /* as with the offset, it seems that GNAT likes to
+ generate negative sizes so we use atoi here in
+ order to allow them - see bug 109385 for details */
+ sz =3D atoi(&p, 0);
} else {
/* sometimes the size is missing and assumed to be a
pointer (in bits) */
|
|
From: <sv...@va...> - 2005-07-21 10:07:18
|
Author: sewardj
Date: 2005-07-21 11:07:13 +0100 (Thu, 21 Jul 2005)
New Revision: 1284
Log:
Implement STC/CLC/CMC, and take the opportunity to make PUSHFL work a
bit more like how the hardware does.
Modified:
trunk/priv/guest-x86/toIR.c
Modified: trunk/priv/guest-x86/toIR.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/guest-x86/toIR.c 2005-07-20 10:55:26 UTC (rev 1283)
+++ trunk/priv/guest-x86/toIR.c 2005-07-21 10:07:13 UTC (rev 1284)
@@ -10989,8 +10989,15 @@
assign( t1, binop(Iop_Sub32,getIReg(4,R_ESP),mkU32(sz)) );
putIReg(4, R_ESP, mkexpr(t1) );
=20
+ /* Calculate OSZACP, and patch in fixed fields as per
+ Intel docs.=20
+ - bit 1 is always 1
+ - bit 9 is Interrupt Enable (should always be 1 in user mode?)
+ */
t2 =3D newTemp(Ity_I32);
- assign( t2, mk_x86g_calculate_eflags_all() );
+ assign( t2, binop(Iop_Or32,=20
+ mk_x86g_calculate_eflags_all(),=20
+ mkU32( (1<<1)|(1<<9) ) ));
=20
/* Patch in the D flag. This can simply be a copy of bit 10 of
baseBlock[OFFB_DFLAG]. */
@@ -11102,29 +11109,38 @@
DIP("std\n");
break;
=20
-//-- case 0xF8: /* CLC */
-//-- uInstr0(cb, CALLM_S, 0);
-//-- uInstr1(cb, CALLM, 0, Lit16, VGOFF_(helper_CLC));
-//-- uFlagsRWU(cb, FlagsEmpty, FlagC, FlagsOSZAP);
-//-- uInstr0(cb, CALLM_E, 0);
-//-- DIP("clc\n");
-//-- break;
-//--=20
-//-- case 0xF9: /* STC */
-//-- uInstr0(cb, CALLM_S, 0);
-//-- uInstr1(cb, CALLM, 0, Lit16, VGOFF_(helper_STC));
-//-- uFlagsRWU(cb, FlagsEmpty, FlagC, FlagsOSZAP);
-//-- uInstr0(cb, CALLM_E, 0);
-//-- DIP("stc\n");
-//-- break;
-//--=20
-//-- case 0xF5: /* CMC */
-//-- uInstr0(cb, CALLM_S, 0);
-//-- uInstr1(cb, CALLM, 0, Lit16, VGOFF_(helper_CMC));
-//-- uFlagsRWU(cb, FlagC, FlagC, FlagsOSZAP);
-//-- uInstr0(cb, CALLM_E, 0);
-//-- DIP("cmc\n");
-//-- break;
+ case 0xF8: /* CLC */
+ case 0xF9: /* STC */
+ case 0xF5: /* CMC */
+ t0 =3D newTemp(Ity_I32);
+ t1 =3D newTemp(Ity_I32);
+ assign( t0, mk_x86g_calculate_eflags_all() );
+ switch (opc) {
+ case 0xF8:=20
+ assign( t1, binop(Iop_And32, mkexpr(t0),=20
+ mkU32(~X86G_CC_MASK_C)));
+ DIP("clc\n");
+ break;
+ case 0xF9:=20
+ assign( t1, binop(Iop_Or32, mkexpr(t0),=20
+ mkU32(X86G_CC_MASK_C)));
+ DIP("stc\n");
+ break;
+ case 0xF5:=20
+ assign( t1, binop(Iop_Xor32, mkexpr(t0),=20
+ mkU32(X86G_CC_MASK_C)));
+ DIP("cmc\n");
+ break;
+ default:=20
+ vpanic("disInstr(x86)(clc/stc/cmc)");
+ }
+ stmt( IRStmt_Put( OFFB_CC_OP, mkU32(X86G_CC_OP_COPY) ));
+ stmt( IRStmt_Put( OFFB_CC_DEP2, mkU32(0) ));
+ stmt( IRStmt_Put( OFFB_CC_DEP1, mkexpr(t1) ));
+ /* Set NDEP even though it isn't used. This makes redundant-PUT
+ elimination of previous stores to this field work better. */
+ stmt( IRStmt_Put( OFFB_CC_NDEP, mkU32(0) ));
+ break;
=20
/* REPNE prefix insn */
case 0xF2: {=20
|
|
From: Julian S. <js...@ac...> - 2005-07-21 08:57:07
|
Great stuff! I like it. My only reservation is that the output is a bit verbose. At a minimum, could we have the current results first, and then the 24-h results, and then the diff? So I don't have to scroll down in kmail to see the most recent results. Ideally I was hoping for the following, but perhaps it's a bit much as I realise this would involve extracting the relevant parts of the short logfiles, which isn't obvious how to do. (note: the implication is I don't really care about the 24-h ago build results, which is true). J Nightly build on nemesis ( SuSE 9.0 ) started at 2005-07-20 16:08:00 CDT ### these are the current build results Checking out vex source tree ... done Building vex ... done Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed ------------ Regression test results ------------ == 180 tests, 3 stderr failures, 0 stdout failures ================= memcheck/tests/stack_changes (stderr) none/tests/faultstatus (stderr) none/tests/x86/int (stderr) ------------ Yesterday's regression test results ------------ == 180 tests, 4 stderr failures, 2 stdout failures ================= memcheck/tests/stack_changes (stderr) memcheck/tests/xml1 (stderr) none/tests/cmdline1 (stdout) none/tests/cmdline2 (stdout) none/tests/faultstatus (stderr) none/tests/x86/int (stderr) ------------ Difference ------------ ! == 180 tests, 4 stderr failures, 2 stdout failures ================= memcheck/tests/stack_changes (stderr) - memcheck/tests/xml1 (stderr) - none/tests/cmdline1 (stdout) - none/tests/cmdline2 (stdout) none/tests/faultstatus (stderr) --- 10,13 ---- ! == 180 tests, 3 stderr failures, 0 stdout failures ================= memcheck/tests/stack_changes (stderr) none/tests/faultstatus (stderr) |
|
From: Tom H. <th...@cy...> - 2005-07-21 02:47:04
|
Nightly build on dellow ( x86_64, Fedora Core 4 ) started at 2005-07-21 03:10:05 BST Checking out vex source tree ... done Building vex ... done Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 159 tests, 6 stderr failures, 0 stdout failures ================= memcheck/tests/sigprocmask (stderr) memcheck/tests/strchr (stderr) memcheck/tests/vgtest_ume (stderr) memcheck/tests/weirdioctl (stderr) memcheck/tests/xml1 (stderr) none/tests/faultstatus (stderr) |
|
From: <js...@ac...> - 2005-07-21 02:45:12
|
Nightly build on g5 ( YDL 4.0, ppc970 ) started at 2005-07-21 04:40:01 CEST Checking out vex source tree ... done Building vex ... done Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 154 tests, 102 stderr failures, 20 stdout failures ================= memcheck/tests/addressable (stderr) memcheck/tests/badaddrvalue (stderr) memcheck/tests/badfree-2trace (stderr) memcheck/tests/badfree (stderr) memcheck/tests/badjump (stderr) memcheck/tests/badjump2 (stderr) memcheck/tests/badloop (stderr) memcheck/tests/badpoll (stderr) memcheck/tests/badrw (stderr) memcheck/tests/brk (stderr) memcheck/tests/brk2 (stderr) memcheck/tests/buflen_check (stderr) memcheck/tests/clientperm (stderr) memcheck/tests/custom_alloc (stderr) memcheck/tests/describe-block (stderr) memcheck/tests/doublefree (stderr) memcheck/tests/erringfds (stderr) memcheck/tests/error_counts (stdout) memcheck/tests/errs1 (stderr) memcheck/tests/execve (stderr) memcheck/tests/execve2 (stderr) memcheck/tests/exitprog (stderr) memcheck/tests/fprw (stderr) memcheck/tests/fwrite (stderr) memcheck/tests/inits (stderr) memcheck/tests/inline (stderr) memcheck/tests/leak-0 (stderr) memcheck/tests/leak-cycle (stderr) memcheck/tests/leak-regroot (stderr) memcheck/tests/leak-tree (stderr) memcheck/tests/malloc1 (stderr) memcheck/tests/malloc2 (stderr) memcheck/tests/malloc3 (stderr) memcheck/tests/manuel1 (stderr) memcheck/tests/manuel2 (stderr) memcheck/tests/manuel3 (stderr) memcheck/tests/match-overrun (stderr) memcheck/tests/memalign2 (stderr) memcheck/tests/memalign_test (stderr) memcheck/tests/memcmptest (stderr) memcheck/tests/mempool (stderr) memcheck/tests/mismatches (stderr) memcheck/tests/mmaptest (stderr) memcheck/tests/nanoleak (stderr) memcheck/tests/nanoleak_supp (stderr) memcheck/tests/new_nothrow (stderr) memcheck/tests/new_override (stderr) memcheck/tests/null_socket (stderr) memcheck/tests/overlap (stderr) memcheck/tests/partiallydefinedeq (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/post-syscall (stdout) memcheck/tests/post-syscall (stderr) memcheck/tests/realloc1 (stderr) memcheck/tests/realloc2 (stderr) memcheck/tests/realloc3 (stderr) memcheck/tests/sigaltstack (stderr) memcheck/tests/sigkill (stderr) memcheck/tests/signal2 (stderr) memcheck/tests/sigprocmask (stderr) memcheck/tests/stack_changes (stdout) memcheck/tests/stack_changes (stderr) memcheck/tests/str_tester (stderr) memcheck/tests/strchr (stderr) memcheck/tests/supp1 (stderr) memcheck/tests/supp2 (stderr) memcheck/tests/suppfree (stderr) memcheck/tests/toobig-allocs (stderr) memcheck/tests/trivialleak (stderr) memcheck/tests/vgtest_ume (stderr) memcheck/tests/weirdioctl (stderr) memcheck/tests/with-space (stderr) memcheck/tests/writev (stderr) memcheck/tests/xml1 (stderr) memcheck/tests/zeropage (stderr) cachegrind/tests/chdir (stderr) cachegrind/tests/dlclose (stdout) cachegrind/tests/dlclose (stderr) none/tests/faultstatus (stderr) none/tests/fdleak_cmsg (stderr) none/tests/fdleak_creat (stderr) none/tests/fdleak_dup (stderr) none/tests/fdleak_dup2 (stderr) none/tests/fdleak_fcntl (stderr) none/tests/fdleak_ipv4 (stderr) none/tests/fdleak_open (stderr) none/tests/fdleak_pipe (stderr) none/tests/fdleak_socketpair (stderr) none/tests/floored (stdout) none/tests/fucomip (stderr) none/tests/manythreads (stdout) none/tests/manythreads (stderr) none/tests/nestedfns (stdout) none/tests/nestedfns (stderr) none/tests/pending (stdout) none/tests/pending (stderr) none/tests/pth_atfork1 (stdout) none/tests/pth_atfork1 (stderr) none/tests/pth_blockedsig (stdout) none/tests/pth_blockedsig (stderr) none/tests/pth_cancel1 (stdout) none/tests/pth_cancel1 (stderr) none/tests/pth_cancel2 (stderr) none/tests/pth_cvsimple (stdout) none/tests/pth_cvsimple (stderr) none/tests/pth_exit (stderr) none/tests/pth_once (stdout) none/tests/pth_once (stderr) none/tests/pth_stackalign (stdout) none/tests/pth_stackalign (stderr) none/tests/rcrl (stdout) none/tests/rcrl (stderr) none/tests/res_search (stdout) none/tests/res_search (stderr) none/tests/thread-exits (stdout) none/tests/thread-exits (stderr) none/tests/threaded-fork (stdout) none/tests/threaded-fork (stderr) none/tests/threadederrno (stdout) none/tests/threadederrno (stderr) none/tests/tls (stdout) none/tests/tls (stderr) |
|
From: Tom H. <to...@co...> - 2005-07-21 02:41:57
|
Nightly build on dunsmere ( athlon, Fedora Core 4 ) started at 2005-07-21 03:30:03 BST Checking out vex source tree ... done Building vex ... done Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 181 tests, 5 stderr failures, 0 stdout failures ================= memcheck/tests/leak-tree (stderr) memcheck/tests/weirdioctl (stderr) memcheck/tests/xml1 (stderr) none/tests/faultstatus (stderr) none/tests/x86/int (stderr) |
|
From: Tom H. <th...@cy...> - 2005-07-21 02:31:01
|
Nightly build on gill ( x86_64, Fedora Core 2 ) started at 2005-07-21 03:00:02 BST Checking out vex source tree ... done Building vex ... done Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 159 tests, 7 stderr failures, 1 stdout failure ================= memcheck/tests/sigprocmask (stderr) memcheck/tests/strchr (stderr) memcheck/tests/vgtest_ume (stderr) memcheck/tests/weirdioctl (stderr) memcheck/tests/xml1 (stderr) none/tests/faultstatus (stderr) none/tests/fdleak_fcntl (stderr) none/tests/tls (stdout) |
|
From: <js...@ac...> - 2005-07-21 02:30:39
|
Nightly build on phoenix ( SuSE 9.1 ) started at 2005-07-21 03:30:00 BST Checking out vex source tree ... failed Last 20 lines of log.verbose follow Nightly build on phoenix ( SuSE 9.1 ) started at 2005-07-21 03:30:00 BST svn: Unknown hostname 'svn.valgrind.org' |
|
From: Tom H. <th...@cy...> - 2005-07-21 02:21:25
|
Nightly build on alvis ( i686, Red Hat 7.3 ) started at 2005-07-21 03:15:03 BST Checking out vex source tree ... done Building vex ... done Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 180 tests, 14 stderr failures, 1 stdout failure ================= memcheck/tests/addressable (stderr) memcheck/tests/describe-block (stderr) memcheck/tests/erringfds (stderr) memcheck/tests/leak-0 (stderr) memcheck/tests/leak-cycle (stderr) memcheck/tests/leak-regroot (stderr) memcheck/tests/leak-tree (stderr) memcheck/tests/match-overrun (stderr) memcheck/tests/partiallydefinedeq (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/sigkill (stderr) memcheck/tests/stack_changes (stderr) none/tests/faultstatus (stderr) none/tests/x86/int (stderr) none/tests/x86/yield (stdout) |
|
From: Tom H. <th...@cy...> - 2005-07-21 02:12:18
|
Nightly build on aston ( x86_64, Fedora Core 3 ) started at 2005-07-21 03:05:09 BST Checking out vex source tree ... done Building vex ... done Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 159 tests, 6 stderr failures, 0 stdout failures ================= memcheck/tests/sigprocmask (stderr) memcheck/tests/strchr (stderr) memcheck/tests/vgtest_ume (stderr) memcheck/tests/weirdioctl (stderr) memcheck/tests/xml1 (stderr) none/tests/faultstatus (stderr) |
|
From: Dirk M. <dm...@gm...> - 2005-07-21 00:52:36
|
Hi, I've looked into the valgrind-2.4 branch and de-digested the changes in it: BUGS FIXED: - fixed regression in stabs parsing introduced by fixing bug 90128 - major performance fix by Pete Moceyunas to improve malloc handling. - several smaller fixes to the code, as detected in a code analysis performed by Madhu Kurup using the "Prevent" Standford code checker. - VG_(atoll36) fixed. - fixed double free in reading ~/.valgrindrc - removed irrelevant linker version script that broke compilation with newer binutils. - 88678: fix debug info for file names containing spaces - 106713: preserve %esi accross calls to clone. - 103509, 106293, 104797, 101881: backported from 3.0 development - fix valgrind crash when no environment is given to an execve() call - disable PIE compilation by default, it just caused too many nonworking builds and accordingly many bugreports. - fix stabs debug info reading for FreePascal binaries New features: The macros VALGRIND_STACK_REGISTER, VALGRIND_STACK_DEREGISTER and VALGRIND_STACK_CHANGE have been added. These can be used to inform valgrind about stack switches (if your application uses userland threading libraries). Thats not a big list, but its still something I think. So would it be okay with everyone if I prepare a tarball and prepare updates to the website? Dirk |
|
From: Nicholas N. <nj...@cs...> - 2005-07-21 00:16:33
|
Hi, I've rewritten the nightly test script to test both the current Valgrind and the one from 24 hours ago. It's attached. If there is no difference between the 24-hour-old results and the current results, it just shows the current results, same as it does now. If there is a difference, it shows the diff and both sets of output. An example of this is attached. If there are no objections I'll check it in, and Tom and Julian can roll it out onto their test machines. Thanks. N |