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
(11) |
2
(8) |
|
3
(8) |
4
(8) |
5
(8) |
6
(19) |
7
(17) |
8
(12) |
9
(10) |
|
10
(15) |
11
(18) |
12
(14) |
13
(16) |
14
(24) |
15
(16) |
16
(12) |
|
17
(25) |
18
(23) |
19
(12) |
20
(10) |
21
(9) |
22
(12) |
23
(13) |
|
24
(19) |
25
(7) |
26
(39) |
27
(22) |
28
(22) |
29
(16) |
30
(13) |
|
31
(23) |
|
|
|
|
|
|
|
From: <sv...@va...> - 2006-12-16 14:25:09
|
Author: sewardj
Date: 2006-12-16 14:25:04 +0000 (Sat, 16 Dec 2006)
New Revision: 6405
Log:
64-bit followup to r6404: fix and simplify the inline assembly, so it
works right when compiled by gcc-4.1.0. Also add a new flag, -A, to
test all available instructions.
Modified:
trunk/none/tests/ppc32/jm-insns.c
Modified: trunk/none/tests/ppc32/jm-insns.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/none/tests/ppc32/jm-insns.c 2006-12-16 05:00:38 UTC (rev 6404)
+++ trunk/none/tests/ppc32/jm-insns.c 2006-12-16 14:25:04 UTC (rev 6405)
@@ -5115,7 +5115,7 @@
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
volatile HWord_t res;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, j, k, arg_step;
=20
arg_step =3D (arg_list_size =3D=3D 0) ? 7 : 3;
@@ -5130,29 +5130,11 @@
r14 =3D iargs[i];
r15 =3D iargs[j];
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
res =3D r17;
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
printf("%s %016lx, %016lx, %2d =3D> %016lx (%08x %08x)\n",
name, iargs[i], iargs[j], k, res, flags, xer);
}
@@ -5167,7 +5149,7 @@
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
volatile HWord_t res;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, j, k, arg_step;
=20
arg_step =3D (arg_list_size =3D=3D 0) ? 7 : 3;
@@ -5183,29 +5165,11 @@
=20
r14 =3D iargs[i];
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
res =3D r17;
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
printf("%s %016lx, %2d, %2d =3D> %016lx (%08x %08x)\n",
name, iargs[i], j, k, res, flags, xer);
}
@@ -5220,7 +5184,7 @@
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
volatile HWord_t res;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, j, arg_step;
=20
arg_step =3D (arg_list_size =3D=3D 0) ? 7 : 3;
@@ -5234,29 +5198,11 @@
=20
r14 =3D iargs[i];
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
res =3D r17;
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
printf("%s %016lx, %2d =3D> %016lx (%08x %08x)\n",
name, iargs[i], j, res, flags, xer);
}
@@ -7449,6 +7395,7 @@
"\t-i: test integer instructions (default)\n"
"\t-f: test floating point instructions\n"
"\t-a: test altivec instructions\n"
+ "\t-A: test all (int, fp, altivec) instructions\n"
"\t-v: be verbose\n"
"\t-h: display this help and exit\n"
);
@@ -7465,6 +7412,9 @@
insn_sel_flags_t flags;
int c;
=20
+ // check HWord_t really is a host word
+ assert(sizeof(void*) =3D=3D sizeof(HWord_t));
+
flags.one_arg =3D 0;
flags.two_args =3D 0;
flags.three_args =3D 0;
@@ -7591,6 +7541,7 @@
./jm-insns -i =3D> int insns
./jm-insns -f =3D> fp insns
./jm-insns -a =3D> av insns
+ ./jm-insns -A =3D> int, fp and avinsns
*/
char *filter =3D NULL;
insn_sel_flags_t flags;
@@ -7614,7 +7565,7 @@
// Flags
flags.cr =3D 2;
=20
- while ((c =3D getopt(argc, argv, "ifahv")) !=3D -1) {
+ while ((c =3D getopt(argc, argv, "ifahvA")) !=3D -1) {
switch (c) {
case 'i':
flags.integer =3D 1;
@@ -7626,6 +7577,12 @@
flags.altivec =3D 1;
flags.faltivec =3D 1;
break;
+ case 'A':
+ flags.integer =3D 1;
+ flags.floats =3D 1;
+ flags.altivec =3D 1;
+ flags.faltivec =3D 1;
+ break;
case 'h':
usage();
return 0;
|
|
From: <js...@ac...> - 2006-12-16 05:04:02
|
Nightly build on phoenix ( SuSE 10.0 ) started at 2006-12-16 04:30:01 GMT 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 == 250 tests, 6 stderr failures, 1 stdout failure, 0 posttest failures == memcheck/tests/leak-tree (stderr) memcheck/tests/pointer-trace (stderr) memcheck/tests/stack_switch (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/x86/scalar_supp (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) |
|
From: <js...@ac...> - 2006-12-16 05:02:04
|
Nightly build on minnie ( SuSE 10.0, ppc32 ) started at 2006-12-16 09:00:01 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 215 tests, 10 stderr failures, 7 stdout failures, 0 posttest failures == memcheck/tests/leak-tree (stderr) memcheck/tests/leakotron (stdout) memcheck/tests/pointer-trace (stderr) memcheck/tests/stack_changes (stderr) memcheck/tests/xml1 (stderr) none/tests/faultstatus (stderr) none/tests/fdleak_cmsg (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) none/tests/ppc32/jm-fp (stdout) none/tests/ppc32/jm-fp (stderr) none/tests/ppc32/jm-int (stdout) none/tests/ppc32/round (stdout) none/tests/ppc32/round (stderr) none/tests/ppc32/test_fx (stdout) none/tests/ppc32/test_fx (stderr) none/tests/ppc32/test_gx (stdout) |
|
From: <sv...@va...> - 2006-12-16 05:00:42
|
Author: sewardj
Date: 2006-12-16 05:00:38 +0000 (Sat, 16 Dec 2006)
New Revision: 6404
Log:
Fix and simplify the inline assembly, so it works right when compiled
by gcc-4.1.0.
Modified:
trunk/none/tests/ppc32/jm-insns.c
Modified: trunk/none/tests/ppc32/jm-insns.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/none/tests/ppc32/jm-insns.c 2006-12-16 04:58:59 UTC (rev 6403)
+++ trunk/none/tests/ppc32/jm-insns.c 2006-12-16 05:00:38 UTC (rev 6404)
@@ -177,25 +177,53 @@
#endif // #ifndef __powerpc64__
=20
=20
+#define ALLCR "cr0","cr1","cr2","cr3","cr4","cr5","cr6","cr7"
+
+#define SET_CR(_arg) \
+ __asm__ __volatile__ ("mtcr %0" : : "b"(_arg) : ALLCR );
+
+#define SET_XER(_arg) \
+ __asm__ __volatile__ ("mtxer %0" : : "b"(_arg) : "xer" );
+
+#define GET_CR(_lval) \
+ __asm__ __volatile__ ("mfcr %0" : "=3Db"(_lval) )
+
+#define GET_XER(_lval) \
+ __asm__ __volatile__ ("mfxer %0" : "=3Db"(_lval) )
+
+#define GET_CR_XER(_lval_cr,_lval_xer) \
+ do { GET_CR(_lval_cr); GET_XER(_lval_xer); } while (0)
+
+#define SET_CR_ZERO \
+ SET_CR(0)
+
+#define SET_XER_ZERO \
+ SET_XER(0)
+
+#define SET_CR_XER_ZERO \
+ do { SET_CR_ZERO; SET_XER_ZERO; } while (0)
+
+#define SET_FPSCR_ZERO \
+ do { double _d =3D 0.0; \
+ __asm__ __volatile__ ("mtfsf 0xFF, %0" : : "f"(_d) ); \
+ } while (0)
+
+
+/* XXXX these must all be callee-save regs! */
register double f14 __asm__ ("f14");
register double f15 __asm__ ("f15");
register double f16 __asm__ ("f16");
register double f17 __asm__ ("f17");
-register double f18 __asm__ ("f18");
register HWord_t r14 __asm__ ("r14");
register HWord_t r15 __asm__ ("r15");
register HWord_t r16 __asm__ ("r16");
register HWord_t r17 __asm__ ("r17");
-register HWord_t r18 __asm__ ("r18");
=20
#if defined (HAS_ALTIVEC)
# include <altivec.h>
#endif
#include <assert.h>
#include <ctype.h> // isspace
-//#include <fcntl.h>
-//#include <fenv.h>
-//#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -4540,7 +4568,7 @@
unused uint32_t test_flags)
{
volatile HWord_t res;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, j, k;
=20
for (i=3D0; i<nb_iargs; i++) {
@@ -4550,29 +4578,11 @@
r15 =3D iargs[j];
r16 =3D iargs[k];
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
res =3D r17;
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %08x, %08x, %08x =3D> %08x (%08x %08x)\n",
#else
@@ -4589,7 +4599,7 @@
uint32_t test_flags)
{
volatile HWord_t res;
- volatile uint32_t flags, xer, xer_orig, tmpcr, tmpxer;
+ volatile uint32_t flags, xer, xer_orig;
int i, j, is_div, zap_hi32;
=20
// catches div, divwu, divo, divwu, divwuo, and . variants
@@ -4601,37 +4611,21 @@
redo:
for (i=3D0; i<nb_iargs; i++) {
for (j=3D0; j<nb_iargs; j++) {
- r14 =3D iargs[i];
- r15 =3D iargs[j];
+
/* result of division by zero is implementation dependent.
don't test it. */
if (is_div && iargs[j] =3D=3D 0)
continue;
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
+ r14 =3D iargs[i];
+ r15 =3D iargs[j];
=20
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D xer_orig;
- __asm__ __volatile__ ("mtxer 18");
+ SET_XER(xer_orig);
+ SET_CR_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
res =3D r17;
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %08x, %08x =3D> %08x (%08x %08x)\n",
#else
@@ -4652,38 +4646,19 @@
uint32_t test_flags)
{
volatile HWord_t res;
- volatile uint32_t flags, xer, xer_orig, tmpcr, tmpxer;
+ volatile uint32_t flags, xer, xer_orig;
int i;
=20
xer_orig =3D 0x00000000;
redo:
for (i=3D0; i<nb_iargs; i++) {
r14 =3D iargs[i];
-
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D xer_orig;
- __asm__ __volatile__ ("mtxer 18");
+ SET_XER(xer_orig);
+ SET_CR_ZERO;
(*func)();
res =3D r17;
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %08x =3D> %08x (%08x %08x)\n",
#else
@@ -4768,7 +4743,7 @@
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
volatile HWord_t res;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, j;
=20
for (i=3D0; i<nb_iargs; i++) {
@@ -4779,29 +4754,11 @@
=20
r14 =3D iargs[i];
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
res =3D r17;
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %08x, %08x =3D> %08x (%08x %08x)\n",
#else
@@ -4843,7 +4800,7 @@
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
volatile HWord_t res;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, j, k, l, arg_step;
=20
arg_step =3D (arg_list_size =3D=3D 0) ? 31 : 3;
@@ -4862,29 +4819,11 @@
=20
r14 =3D iargs[i];
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
res =3D r17;
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %08x, %2d, %2d, %2d =3D> %08x (%08x %08x)\n",
#else
@@ -4904,7 +4843,7 @@
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
volatile HWord_t res;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, j, k, l, arg_step;
=20
arg_step =3D (arg_list_size =3D=3D 0) ? 31 : 3;
@@ -4921,29 +4860,11 @@
r14 =3D iargs[i];
r15 =3D iargs[j];
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
res =3D r17;
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %08x, %08x, %2d, %2d =3D> %08x (%08x %08x)\n",
#else
@@ -4963,7 +4884,7 @@
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
volatile HWord_t res;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, j, arg_step;
=20
arg_step =3D (arg_list_size =3D=3D 0) ? 31 : 1;
@@ -4976,29 +4897,11 @@
=20
r14 =3D iargs[i];
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
res =3D r17;
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %08x, %2d =3D> %08x (%08x %08x)\n",
#else
@@ -5015,7 +4918,7 @@
{
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, j, k, arg_step;
=20
arg_step =3D (arg_list_size =3D=3D 0) ? 7 : 1;
@@ -5030,28 +4933,11 @@
=20
r14 =3D iargs[i];
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 14");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR(r14);
+ SET_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %d, %d (%08x) =3D> (%08x %08x)\n",
#else
@@ -5064,19 +4950,12 @@
}
}
=20
-#if 0
-static void mcrfs_cb (const char* name, test_func_t func,
- unused uint32_t test_flags)
-{}
-#endif
-
-
static void mcrxr_cb (const char* name, test_func_t func_IN,
unused uint32_t test_flags)
{
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, j, k, arg_step;
=20
arg_step =3D 1; //(arg_list_size =3D=3D 0) ? 7 : 1;
@@ -5090,28 +4969,11 @@
=20
r14 =3D j;
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 14");
+ SET_CR_ZERO;
+ SET_XER(r14);
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
printf("%s %d (%08x) =3D> (%08x %08x)\n",
name, k, j, flags, xer);
}
@@ -5123,35 +4985,19 @@
unused uint32_t test_flags)
{
volatile HWord_t res;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i;
=20
for (i=3D0; i<nb_iargs; i++) {
r14 =3D iargs[i];
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
/* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 14");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR(r14);
+ SET_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
res =3D r17;
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s (%08x) =3D> %08x (%08x %08x)\n",
#else
@@ -5176,7 +5022,7 @@
__asm__ __volatile__(
"mtxer %1\n"
"\tmfxer %0"
- : /*out*/"=3Dr"(res) : /*in*/"r"(j) : /*trashed*/"xer"=20
+ : /*out*/"=3Db"(res) : /*in*/"b"(j) : /*trashed*/"xer"=20
);
res &=3D 0xE000007F; /* rest of the bits are undefined */
=20
@@ -5194,7 +5040,7 @@
__asm__ __volatile__(
"mtlr %1\n"
"\tmflr %0"
- : /*out*/"=3Dr"(res) : /*in*/"r"(j) : /*trashed*/"lr"=20
+ : /*out*/"=3Db"(res) : /*in*/"b"(j) : /*trashed*/"lr"=20
);
=20
#ifndef __powerpc64__
@@ -5211,7 +5057,7 @@
__asm__ __volatile__(
"mtctr %1\n"
"\tmfctr %0"
- : /*out*/"=3Dr"(res) : /*in*/"r"(j) : /*trashed*/"ctr"=20
+ : /*out*/"=3Db"(res) : /*in*/"b"(j) : /*trashed*/"ctr"=20
);
=20
#ifndef __powerpc64__
@@ -5221,220 +5067,14 @@
#endif
name, j, res);
}
-
-#if 0
- // mfxer
- j =3D 1;
- for (k=3D0; k<nb_iargs; k++) {
- r14 =3D iargs[k];
-
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- // Only valid bits of xer: 0xE000007F
- __asm__ __volatile__ ("lis 15,0xE000");
- __asm__ __volatile__ ("addi 15,15,0x007F");
- __asm__ __volatile__ ("and 16,15,14");
- =20
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 16");
- __asm__ __volatile__ ("mtlr 18");
- __asm__ __volatile__ ("mtctr 18");
- =20
- __asm__ __volatile__ ("mfspr 17, 1"); // func()
- =20
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mflr 18");
- lr =3D r18;
- __asm__ __volatile__ ("mfctr 18");
- ctr =3D r18;
- res =3D r17;
-
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
- printf("%s %d (%08x) =3D> %08x (%08x %08x, %08x, %08x)\n",
- name, j, iargs[k], res, flags, xer, lr, ctr);
- }
- if (verbose) printf("\n");
- =20
- // mflr
- j =3D 8;
- for (k=3D0; k<nb_iargs; k++) {
- r14 =3D iargs[k];
-
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtlr 14");
- __asm__ __volatile__ ("mtctr 18");
- __asm__ __volatile__ ("mtxer 18");
-
- __asm__ __volatile__ ("mfspr 17, 8"); // func()
- =20
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mflr 18");
- lr =3D r18;
- __asm__ __volatile__ ("mfctr 18");
- ctr =3D r18;
- res =3D r17;
-
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
- printf("%s %d (%08x) =3D> %08x (%08x %08x, %08x, %08x)\n",
- name, j, iargs[k], res, flags, xer, lr, ctr);
- }
- if (verbose) printf("\n");
-
- // mfctr
- j =3D 9;
- for (k=3D0; k<nb_iargs; k++) {
- r14 =3D iargs[k];
-
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtctr 14");
- __asm__ __volatile__ ("mtxer 18");
- __asm__ __volatile__ ("mtlr 18");
- =20
- __asm__ __volatile__ ("mfspr 17, 9"); // func()
- =20
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
- __asm__ __volatile__ ("mflr 18");
- lr =3D r18;
- __asm__ __volatile__ ("mfctr 18");
- ctr =3D r18;
- res =3D r17;
-
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
- printf("%s %d (%08x) =3D> %08x (%08x %08x, %08x, %08x)\n",
- name, j, iargs[k], res, flags, xer, lr, ctr);
- }
-#endif
}
=20
-#if 0
-static void mftb_cb (const char* name, test_func_t func,
- unused uint32_t test_flags)
-{
-// How to test this?
-// 1) TBU won't change for a while
-// 2) TBL will have changed every loop iter
-
- volatile HWord_t res;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
- int i, j;
- =20
- i =3D 269;
- for (j=3D0; j<16; j++) {
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
- =20
- __asm__ __volatile__ ("mftb 17, 269"); // func
- =20
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
- res =3D r17;
-
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
- printf("%s %d =3D> %08x (%08x %08x)\n",
- name, i, res, flags, xer);
- }
- if (verbose) printf("\n");
- =20
- i =3D 268;
- for (j=3D0; j<16; j++) {
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
- =20
- __asm__ __volatile__ ("mftb 17, 268"); // func
- =20
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
- res =3D r17;
-
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
- printf("%s %d =3D> %08x (%08x %08x)\n",
- name, i, res, flags, xer);
- }
-}
-#endif
-
static void mtcrf_cb (const char* name, test_func_t func_IN,
unused uint32_t test_flags)
{
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, j, arg_step;
=20
arg_step =3D (arg_list_size =3D=3D 0) ? 99 : 1;
@@ -5447,28 +5087,10 @@
=20
r14 =3D iargs[i];
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %3d, %08x =3D> (%08x %08x)\n",
#else
@@ -5484,150 +5106,6 @@
static void mtspr_cb (const char* name, test_func_t func,
unused uint32_t test_flags)
{
-#if 0
- volatile HWord_t ctr, lr;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
- int j, k;
- func =3D func; // just to stop compiler complaining
- =20
- // mtxer
- j =3D 1;
- for (k=3D0; k<nb_iargs; k++) {
- r14 =3D iargs[k];
-
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- =20
- // Only valid bits of xer: 0xE000007F
- // VEX masks these (maybe it shouldn't?), so let's do it first:
- __asm__ __volatile__ ("lis 15,0xE000");
- __asm__ __volatile__ ("addi 15,15,0x007F");
- __asm__ __volatile__ ("and 16,15,14");
- =20
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
- __asm__ __volatile__ ("mtlr 18");
- __asm__ __volatile__ ("mtctr 18");
- =20
- __asm__ __volatile__ ("mtxer 16"); // func()
- =20
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mflr 18");
- lr =3D r18;
- __asm__ __volatile__ ("mfctr 18");
- ctr =3D r18;
-
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
-#ifndef __powerpc64__
- printf("%s %d, %08x =3D> (%08x %08x, %08x, %08x)\n",
-#else
- printf("%s %d, %016lx =3D> (%08x %08x, %016lx, %016lx)\n",
-#endif
- name, j, iargs[k], flags, xer, lr, ctr);
- }
- if (verbose) printf("\n");
- =20
- // mtlr
- j =3D 8;
- for (k=3D0; k<nb_iargs; k++) {
- r14 =3D iargs[k];
-
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0x0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtlr 18");
- __asm__ __volatile__ ("mtctr 18");
- __asm__ __volatile__ ("mtxer 18");
- =20
- __asm__ __volatile__ ("mtlr 14"); // func()
- =20
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mflr 18");
- lr =3D r18;
- __asm__ __volatile__ ("mfctr 17"); // CAB: if 18, bashes lr - bad=
gcc opt?
- ctr =3D r17;
-
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
-#ifndef __powerpc64__
- printf("%s %d, %08x =3D> (%08x %08x, %08x, %08x)\n",
-#else
- printf("%s %d, %016lx =3D> (%08x %08x, %016lx, %016lx)\n",
-#endif
- name, j, iargs[k], flags, xer, lr, ctr);
- }
- if (verbose) printf("\n");
- =20
- // mtctr
- j =3D 9;
- for (k=3D0; k<nb_iargs; k++) {
- r14 =3D iargs[k];
-
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtctr 18");
- __asm__ __volatile__ ("mtxer 18");
- __asm__ __volatile__ ("mtlr 18");
- =20
- __asm__ __volatile__ ("mtctr 14"); // func()
- =20
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mflr 18");
- lr =3D r18;
- __asm__ __volatile__ ("mfctr 17");
- ctr =3D r17;
-
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
-#ifndef __powerpc64__
- printf("%s %d, %08x =3D> (%08x %08x, %08x, %08x)\n",
-#else
- printf("%s %d, %016lx =3D> (%08x %08x, %016lx, %016lx)\n",
-#endif
- name, j, iargs[k], flags, xer, lr, ctr);
- }
-#endif
}
=20
#ifdef __powerpc64__
@@ -5965,7 +5443,7 @@
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
volatile HWord_t res, base;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, offs, is_lwa=3D0;
=20
#ifdef __powerpc64__
@@ -5986,29 +5464,11 @@
=20
r14 =3D base;
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
- =20
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
res =3D r17;
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %2d, (%08x) =3D> %08x, %2d (%08x %08x)\n",
#else
@@ -6029,29 +5489,11 @@
=20
r14 =3D base;
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
- =20
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
res =3D r17;
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %2d, (%08x) =3D> %08x, %2d (%08x %08x)\n",
#else
@@ -6066,7 +5508,7 @@
unused uint32_t test_flags)
{
volatile HWord_t res, base;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, offs;
=20
// +ve d
@@ -6076,29 +5518,11 @@
r14 =3D base;
r15 =3D offs;
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
- =20
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
res =3D r17;
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %d (%08x) =3D> %08x, %d (%08x %08x)\n",
#else
@@ -6114,7 +5538,7 @@
{
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, offs, k;
HWord_t *iargs_priv, base;
=20
@@ -6136,28 +5560,10 @@
r14 =3D iargs[i]; // read from iargs
r15 =3D base; // store to r15 + offs
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
- =20
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %08x, %2d =3D> %08x, %2d (%08x %08x)\n",
#else
@@ -6182,28 +5588,10 @@
r14 =3D iargs[nb_iargs-1+i]; // read from iargs
r15 =3D base; // store to r15 + offs
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
- =20
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %08x, %2d =3D> %08x, %2d (%08x %08x)\n",
#else
@@ -6219,7 +5607,7 @@
test_func_t func,
unused uint32_t test_flags)
{
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
int i, offs, k;
HWord_t *iargs_priv, base;
=20
@@ -6236,28 +5624,10 @@
r15 =3D base; // store to r15 + offs
r16 =3D offs;
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
- =20
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %08x, %d =3D> %08x, %d (%08x %08x)\n",
#else
@@ -6292,7 +5662,7 @@
{
double res;
uint64_t u0, u1, u2, ur;
- volatile uint32_t flags, tmpcr, tmpxer;
+ volatile uint32_t flags;
int i, j, k;
=20
/* Note: using nb_normal_fargs:
@@ -6309,30 +5679,13 @@
f15 =3D fargs[j];
f16 =3D fargs[k];
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
- f18 =3D +0.0;
- __asm__ __volatile__ ("mtfsf 0xFF, 18");
+ SET_FPSCR_ZERO;
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
+ GET_CR(flags);
res =3D f17;
ur =3D *(uint64_t *)(&res);
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
/* Note: zapping the bottom byte of the result,=20
as vex's accuracy isn't perfect */
ur &=3D 0xFFFFFFFFFFFFFF00ULL;
@@ -6358,7 +5711,7 @@
{
double res;
uint64_t u0, u1, ur;
- volatile uint32_t flags, tmpcr, tmpxer;
+ volatile uint32_t flags;
int i, j;
=20
for (i=3D0; i<nb_fargs; i+=3D3) {
@@ -6368,30 +5721,13 @@
f14 =3D fargs[i];
f15 =3D fargs[j];
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
-
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
- f18 =3D +0.0;
- __asm__ __volatile__ ("mtfsf 0xFF, 18");
+ SET_FPSCR_ZERO;
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
+ GET_CR(flags);
res =3D f17;
ur =3D *(uint64_t *)(&res);
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %016llx, %016llx =3D> %016llx",
#else
@@ -6412,7 +5748,7 @@
{
double res;
uint64_t u0, ur;
- volatile uint32_t flags, tmpcr, tmpxer;
+ volatile uint32_t flags;
int i, zap_hi_32bits;
=20
/* if we're testing fctiw or fctiwz, zap the hi 32bits,
@@ -6423,30 +5759,13 @@
u0 =3D *(uint64_t *)(&fargs[i]);
f14 =3D fargs[i];
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
+ SET_FPSCR_ZERO;
+ SET_CR_XER_ZERO;
+ (*func)();
+ GET_CR(flags);
+ res =3D f17;
+ ur =3D *(uint64_t *)(&res);
=20
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
- f18 =3D +0.0;
- __asm__ __volatile__ ("mtfsf 0xFF, 18");
- (*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- res =3D f17;
- ur =3D *(uint64_t *)(&res);
-
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
if (zap_hi_32bits)
ur &=3D 0xFFFFFFFFULL;
=20
@@ -6531,7 +5850,7 @@
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
uint32_t base;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
volatile double src, res;
int i, offs;
=20
@@ -6553,29 +5872,11 @@
// load from fargs[idx] =3D> r14 + offs
r14 =3D base;
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
- =20
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
res =3D f17;
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %016llx, %4d =3D> %016llx, %4d",
#else
@@ -6596,7 +5897,7 @@
unused uint32_t test_flags)
{
volatile HWord_t base;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
volatile double src, res;
int i, offs;
=20
@@ -6614,29 +5915,11 @@
r14 =3D base;
r15 =3D offs;
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
- =20
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
res =3D f17;
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %016llx, %4d =3D> %016llx, %4d",
#else
@@ -6658,7 +5941,7 @@
volatile test_func_t func;
uint32_t* func_buf =3D get_rwx_area();
HWord_t base;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
double src, *p_dst;
int i, offs;
double *fargs_priv;
@@ -6701,28 +5984,10 @@
f14 =3D src;
r15 =3D base;
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
- =20
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %016llx, %4d =3D> %016llx, %4d",
#else
@@ -6743,7 +6008,7 @@
unused uint32_t test_flags)
{
volatile HWord_t base;
- volatile uint32_t flags, xer, tmpcr, tmpxer;
+ volatile uint32_t flags, xer;
double src, *p_dst;
int i, offs;
double *fargs_priv;
@@ -6782,28 +6047,10 @@
r15 =3D base; // store to r15 + offs
r16 =3D offs;
=20
- /* Save flags */
- __asm__ __volatile__ ("mfcr 18");
- tmpcr =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- tmpxer =3D r18;
- =20
- /* Set up flags for test */
- r18 =3D 0;
- __asm__ __volatile__ ("mtcr 18");
- __asm__ __volatile__ ("mtxer 18");
+ SET_CR_XER_ZERO;
(*func)();
- __asm__ __volatile__ ("mfcr 18");
- flags =3D r18;
- __asm__ __volatile__ ("mfxer 18");
- xer =3D r18;
+ GET_CR_XER(flags,xer);
=20
- /* Restore flags */
- r18 =3D tmpcr;
- __asm__ __volatile__ ("mtcr 18");
- r18 =3D tmpxer;
- __asm__ __volatile__ ("mtxer 18");
-
#ifndef __powerpc64__
printf("%s %016llx, %4d =3D> %016llx, %4d",
#else
|
|
From: <sv...@va...> - 2006-12-16 04:59:05
|
Author: sewardj Date: 2006-12-16 04:58:59 +0000 (Sat, 16 Dec 2006) New Revision: 6403 Log: Fix version. Modified: trunk/NEWS Modified: trunk/NEWS =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=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/NEWS 2006-12-16 00:54:12 UTC (rev 6402) +++ trunk/NEWS 2006-12-16 04:58:59 UTC (rev 6403) @@ -1,9 +1,9 @@ -Release 3.2.0 (XX XXX 2007) +Release 3.3.0 (XX XXX 2007) ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -3.2.0 is a feature release with ... +3.3.0 is a feature release with ... =20 XXX: -* Note in NEWS that behaviour of GET_VBITS and SET_BBITS have changed -- +* Note in NEWS that behaviour of GET_VBITS and SET_VBITS have changed -- they no longer issue addressability errors if either array is partiall= y unaddressable, they just return 3. Also, SET_VBITS doesn't report definedness errors if any of the V bits are undefined. |
|
From: Tom H. <th...@cy...> - 2006-12-16 04:06:50
|
Nightly build on gill ( x86_64, Fedora Core 2 ) started at 2006-12-16 03:00:02 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 282 tests, 6 stderr failures, 2 stdout failures, 0 posttest failures == memcheck/tests/pointer-trace (stderr) memcheck/tests/stack_switch (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/x86/scalar_supp (stderr) none/tests/fdleak_fcntl (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) none/tests/tls (stdout) |
|
From: Tom H. <to...@co...> - 2006-12-16 03:56:03
|
Nightly build on dunsmere ( athlon, Fedora Core 6 ) started at 2006-12-16 03:30:04 GMT Results differ from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 252 tests, 5 stderr failures, 1 stdout failure, 0 posttest failures == memcheck/tests/pointer-trace (stderr) memcheck/tests/stack_switch (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/xml1 (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) ================================================= == Results from 24 hours ago == ================================================= Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 252 tests, 5 stderr failures, 2 stdout failures, 0 posttest failures == memcheck/tests/pointer-trace (stderr) memcheck/tests/stack_switch (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/xml1 (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) none/tests/pth_detached (stdout) ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short Sat Dec 16 03:44:34 2006 --- new.short Sat Dec 16 03:55:57 2006 *************** *** 8,10 **** ! == 252 tests, 5 stderr failures, 2 stdout failures, 0 posttest failures == memcheck/tests/pointer-trace (stderr) --- 8,10 ---- ! == 252 tests, 5 stderr failures, 1 stdout failure, 0 posttest failures == memcheck/tests/pointer-trace (stderr) *************** *** 15,17 **** none/tests/mremap2 (stdout) - none/tests/pth_detached (stdout) --- 15,16 ---- |
|
From: Tom H. <th...@cy...> - 2006-12-16 03:23:40
|
Nightly build on alvis ( i686, Red Hat 7.3 ) started at 2006-12-16 03:15:01 GMT Results differ from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Last 20 lines of verbose log follow echo /tmp/cc0W2XsG.s:4393: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/cc0W2XsG.s:4513: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/cc0W2XsG.s:4633: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/cc0W2XsG.s:4753: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/cc0W2XsG.s:4873: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/cc0W2XsG.s:4993: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/cc0W2XsG.s:5113: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/cc0W2XsG.s:5233: Error: no such instruction: `fisttpq -56(%ebp)' make[5]: *** [insn_sse3.o] Error 1 rm insn_mmx.c insn_sse2.c insn_fpu.c insn_mmxext.c insn_sse.c insn_sse3.c insn_cmov.c insn_basic.c make[5]: Leaving directory `/tmp/valgrind.23648/valgrind/none/tests/x86' make[4]: *** [check-am] Error 2 make[4]: Leaving directory `/tmp/valgrind.23648/valgrind/none/tests/x86' make[3]: *** [check-recursive] Error 1 make[3]: Leaving directory `/tmp/valgrind.23648/valgrind/none/tests' make[2]: *** [check-recursive] Error 1 make[2]: Leaving directory `/tmp/valgrind.23648/valgrind/none' make[1]: *** [check-recursive] Error 1 make[1]: Leaving directory `/tmp/valgrind.23648/valgrind' make: *** [check] Error 2 ================================================= == Results from 24 hours ago == ================================================= Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Last 20 lines of verbose log follow echo /tmp/cc8GrPnf.s:4393: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/cc8GrPnf.s:4513: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/cc8GrPnf.s:4633: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/cc8GrPnf.s:4753: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/cc8GrPnf.s:4873: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/cc8GrPnf.s:4993: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/cc8GrPnf.s:5113: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/cc8GrPnf.s:5233: Error: no such instruction: `fisttpq -56(%ebp)' make[5]: *** [insn_sse3.o] Error 1 rm insn_mmx.c insn_sse2.c insn_fpu.c insn_mmxext.c insn_sse.c insn_sse3.c insn_cmov.c insn_basic.c make[5]: Leaving directory `/tmp/valgrind.23648/valgrind/none/tests/x86' make[4]: *** [check-am] Error 2 make[4]: Leaving directory `/tmp/valgrind.23648/valgrind/none/tests/x86' make[3]: *** [check-recursive] Error 1 make[3]: Leaving directory `/tmp/valgrind.23648/valgrind/none/tests' make[2]: *** [check-recursive] Error 1 make[2]: Leaving directory `/tmp/valgrind.23648/valgrind/none' make[1]: *** [check-recursive] Error 1 make[1]: Leaving directory `/tmp/valgrind.23648/valgrind' make: *** [check] Error 2 ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short Sat Dec 16 03:19:13 2006 --- new.short Sat Dec 16 03:23:32 2006 *************** *** 7,16 **** Last 20 lines of verbose log follow echo ! /tmp/cc8GrPnf.s:4393: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/cc8GrPnf.s:4513: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/cc8GrPnf.s:4633: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/cc8GrPnf.s:4753: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/cc8GrPnf.s:4873: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/cc8GrPnf.s:4993: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/cc8GrPnf.s:5113: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/cc8GrPnf.s:5233: Error: no such instruction: `fisttpq -56(%ebp)' make[5]: *** [insn_sse3.o] Error 1 --- 7,16 ---- Last 20 lines of verbose log follow echo ! /tmp/cc0W2XsG.s:4393: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/cc0W2XsG.s:4513: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/cc0W2XsG.s:4633: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/cc0W2XsG.s:4753: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/cc0W2XsG.s:4873: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/cc0W2XsG.s:4993: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/cc0W2XsG.s:5113: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/cc0W2XsG.s:5233: Error: no such instruction: `fisttpq -56(%ebp)' make[5]: *** [insn_sse3.o] Error 1 |
|
From: Tom H. <th...@cy...> - 2006-12-16 03:23:11
|
Nightly build on dellow ( x86_64, Fedora Core 6 ) started at 2006-12-16 03:10:03 GMT Results differ from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 280 tests, 4 stderr failures, 2 stdout failures, 0 posttest failures == memcheck/tests/pointer-trace (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/xml1 (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) none/tests/pth_detached (stdout) ================================================= == Results from 24 hours ago == ================================================= Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 280 tests, 4 stderr failures, 1 stdout failure, 0 posttest failures == memcheck/tests/pointer-trace (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/xml1 (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short Sat Dec 16 03:16:39 2006 --- new.short Sat Dec 16 03:23:01 2006 *************** *** 8,10 **** ! == 280 tests, 4 stderr failures, 1 stdout failure, 0 posttest failures == memcheck/tests/pointer-trace (stderr) --- 8,10 ---- ! == 280 tests, 4 stderr failures, 2 stdout failures, 0 posttest failures == memcheck/tests/pointer-trace (stderr) *************** *** 14,15 **** --- 14,16 ---- none/tests/mremap2 (stdout) + none/tests/pth_detached (stdout) |
|
From: Tom H. <th...@cy...> - 2006-12-16 03:17:48
|
Nightly build on lloyd ( x86_64, Fedora Core 3 ) started at 2006-12-16 03:05:04 GMT Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 280 tests, 5 stderr failures, 1 stdout failure, 0 posttest failures == memcheck/tests/pointer-trace (stderr) memcheck/tests/stack_switch (stderr) memcheck/tests/x86/scalar (stderr) memcheck/tests/x86/scalar_supp (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) |
|
From: <js...@ac...> - 2006-12-16 01:16:38
|
Nightly build on g5 ( SuSE 10.1, ppc970 ) started at 2006-12-16 02:00:01 CET 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 == 221 tests, 6 stderr failures, 4 stdout failures, 0 posttest failures == memcheck/tests/deep_templates (stdout) memcheck/tests/leak-cycle (stderr) memcheck/tests/leak-tree (stderr) memcheck/tests/pointer-trace (stderr) none/tests/faultstatus (stderr) none/tests/fdleak_cmsg (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) none/tests/ppc32/jm-int (stdout) none/tests/ppc64/jm-int (stdout) |
|
From: <sv...@va...> - 2006-12-16 00:54:16
|
Author: njn
Date: 2006-12-16 00:54:12 +0000 (Sat, 16 Dec 2006)
New Revision: 6402
Log:
Completely overhauled the internals of Memcheck's error handling. All th=
e
different error kinds were reusing the same struct for storing their
details. Each one used some but not all the fields, and the AddrInfo was
similar, and it was very confusing.
So I changed MC_Error and AddrInfo to be tagged unions, like Vex's IRExpr=
and
IRStmt types. The resulting code is a little more verbose but much easie=
r
to understand. I also split up several error kinds, which also made thin=
gs
simpler. The user-visible behaviour is identical except for a couple of
very minor things that I've documented in the NEWS file for the 3.3.0
release.
Ideally I'd get rid of the Addr and Char* fields in the core Error type,
which are not always used, and do them similarly within tools. But that
would require changing the core/tool interface, so I'm leaving it for the
moment.
Modified:
trunk/NEWS
trunk/coregrind/m_errormgr.c
trunk/glibc-2.2.supp
trunk/glibc-2.3.supp
trunk/glibc-2.4.supp
trunk/glibc-2.5.supp
trunk/memcheck/docs/mc-manual.xml
trunk/memcheck/mc_include.h
trunk/memcheck/mc_leakcheck.c
trunk/memcheck/mc_main.c
trunk/memcheck/mc_malloc_wrappers.c
trunk/memcheck/mc_replace_strmem.c
trunk/memcheck/tests/supp_unknown.supp
trunk/xfree-3.supp
trunk/xfree-4.supp
Modified: trunk/NEWS
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=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/NEWS 2006-12-15 04:37:25 UTC (rev 6401)
+++ trunk/NEWS 2006-12-16 00:54:12 UTC (rev 6402)
@@ -1,4 +1,25 @@
+Release 3.2.0 (XX XXX 2007)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+3.2.0 is a feature release with ...
=20
+XXX:
+* Note in NEWS that behaviour of GET_VBITS and SET_BBITS have changed --
+ they no longer issue addressability errors if either array is partiall=
y
+ unaddressable, they just return 3. Also, SET_VBITS doesn't report
+ definedness errors if any of the V bits are undefined.
+
+Other user-visible changes:
+
+- A new suppression kind has been introduced: "Jump". This is for
+ suppressing jump-to-invalid-address errors. Previously you had to use=
an
+ "Addr1" suppression, which didn't make much sense.
+
+- The behaviour of Memcheck's client requests VALGRIND_GET_VBITS and
+ VALGRIND_SET_VBITS have changed slightly. They no longer issue
+ addressability errors -- if either array is partially unaddressable,
+ they just return 3 (as before). Also, SET_VBITS doesn't report
+ definedness errors if any of the V bits are undefined.
+
Release 3.2.1 (16 Sept 2006)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3.2.1 adds x86/amd64 support for all SSE3 instructions except monitor
Modified: trunk/coregrind/m_errormgr.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_errormgr.c 2006-12-15 04:37:25 UTC (rev 6401)
+++ trunk/coregrind/m_errormgr.c 2006-12-16 00:54:12 UTC (rev 6402)
@@ -101,9 +101,6 @@
/*--- Error type ---*/
/*------------------------------------------------------------*/
=20
-/* Note: it is imperative this doesn't overlap with (0..) at all, as too=
ls
- * effectively extend it by defining their own enums in the (0..) range.=
*/
-
/* Errors. Extensible (via the 'extra' field). Tools can use a normal
enum (with element values in the normal range (0..)) for 'ekind'.=20
Functions for getting/setting the tool-relevant fields are in
Modified: trunk/glibc-2.2.supp
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=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/glibc-2.2.supp 2006-12-15 04:37:25 UTC (rev 6401)
+++ trunk/glibc-2.2.supp 2006-12-16 00:54:12 UTC (rev 6402)
@@ -16,7 +16,7 @@
#
# For Memcheck, the supp_kinds are:
#
-# Param Value1 Value2 Value4 Value8 Value16
+# Param Value1 Value2 Value4 Value8 Value16 Jump
# Free Addr1 Addr2 Addr4 Addr8 Addr16
# Cond (previously known as Value0)
#
Modified: trunk/glibc-2.3.supp
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=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/glibc-2.3.supp 2006-12-15 04:37:25 UTC (rev 6401)
+++ trunk/glibc-2.3.supp 2006-12-16 00:54:12 UTC (rev 6402)
@@ -16,7 +16,7 @@
#
# For Memcheck, the supp_kinds are:
#
-# Param Value1 Value2 Value4 Value8 Value16
+# Param Value1 Value2 Value4 Value8 Value16 Jump
# Free Addr1 Addr2 Addr4 Addr8 Addr16
# Cond (previously known as Value0)
#
Modified: trunk/glibc-2.4.supp
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=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/glibc-2.4.supp 2006-12-15 04:37:25 UTC (rev 6401)
+++ trunk/glibc-2.4.supp 2006-12-16 00:54:12 UTC (rev 6402)
@@ -16,7 +16,7 @@
#
# For Memcheck, the supp_kinds are:
#
-# Param Value1 Value2 Value4 Value8 Value16
+# Param Value1 Value2 Value4 Value8 Value16 Jump
# Free Addr1 Addr2 Addr4 Addr8 Addr16
# Cond (previously known as Value0)
#
Modified: trunk/glibc-2.5.supp
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=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/glibc-2.5.supp 2006-12-15 04:37:25 UTC (rev 6401)
+++ trunk/glibc-2.5.supp 2006-12-16 00:54:12 UTC (rev 6402)
@@ -16,7 +16,7 @@
#
# For Memcheck, the supp_kinds are:
#
-# Param Value1 Value2 Value4 Value8 Value16
+# Param Value1 Value2 Value4 Value8 Value16 Jump
# Free Addr1 Addr2 Addr4 Addr8 Addr16
# Cond (previously known as Value0)
#
Modified: trunk/memcheck/docs/mc-manual.xml
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=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/docs/mc-manual.xml 2006-12-15 04:37:25 UTC (rev 6401)
+++ trunk/memcheck/docs/mc-manual.xml 2006-12-16 00:54:12 UTC (rev 6402)
@@ -635,6 +635,11 @@
</listitem>
=20
<listitem>
+ <para>Or: <varname>Jump</varname>, meaning an
+ jump to an unaddressable location error.</para>
+ </listitem>
+
+ <listitem>
<para>Or: <varname>Param</varname>, meaning an
invalid system call parameter error.</para>
</listitem>
Modified: trunk/memcheck/mc_include.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/memcheck/mc_include.h 2006-12-15 04:37:25 UTC (rev 6401)
+++ trunk/memcheck/mc_include.h 2006-12-16 00:54:12 UTC (rev 6402)
@@ -56,7 +56,7 @@
struct _MC_Chunk {
struct _MC_Chunk* next;
Addr data; // ptr to actual block
- SizeT size : (sizeof(UWord)*8)-2; // size requested; 30 or =
62 bits
+ SizeT szB : (sizeof(UWord)*8)-2; // size requested; 30 or 6=
2 bits
MC_AllocKind allockind : 2; // which wrapper did the allocation
ExeContext* where; // where it was allocated
}
@@ -120,28 +120,6 @@
=20
=20
/*------------------------------------------------------------*/
-/*--- Errors and suppressions ---*/
-/*------------------------------------------------------------*/
-
-/* Extra info for overlap errors */
-typedef
- struct {
- Addr src;
- Addr dst;
- Int len; // -1 if unused
- }
- OverlapExtra;
-
-extern void MC_(record_free_error) ( ThreadId tid, Addr a );=20
-extern void MC_(record_illegal_mempool_error) ( ThreadId tid, Addr a );
-extern void MC_(record_freemismatch_error) ( ThreadId tid, Addr a,
- MC_Chunk* mc );
-extern Bool MC_(record_leak_error) ( ThreadId tid,=20
- void* leak_extra,
- ExeContext* where,
- Bool print_record );
-
-/*------------------------------------------------------------*/
/*--- Profiling of memory events ---*/
/*------------------------------------------------------------*/
=20
@@ -201,6 +179,21 @@
/*--- Leak checking ---*/
/*------------------------------------------------------------*/
=20
+/* A block is either=20
+ -- Proper-ly reached; a pointer to its start has been found
+ -- Interior-ly reached; only an interior pointer to it has been found
+ -- Unreached; so far, no pointers to any part of it have been found.=20
+ -- IndirectLeak; leaked, but referred to by another leaked block
+*/
+typedef=20
+ enum {=20
+ Unreached =3D0,=20
+ IndirectLeak =3D1,
+ Interior =3D2,=20
+ Proper =3D3
+ }
+ Reachedness;
+
/* For VALGRIND_COUNT_LEAKS client request */
extern SizeT MC_(bytes_leaked);
extern SizeT MC_(bytes_indirect);
@@ -208,9 +201,6 @@
extern SizeT MC_(bytes_reachable);
extern SizeT MC_(bytes_suppressed);
=20
-/* For leak checking */
-extern void MC_(pp_LeakError)(void* extra);
- =20
typedef
enum {
LC_Off,
@@ -219,13 +209,45 @@
}
LeakCheckMode;
=20
+/* A block record, used for generating err msgs. */
+typedef
+ struct _LossRecord {
+ struct _LossRecord* next;
+ /* Where these lost blocks were allocated. */
+ ExeContext* allocated_at;
+ /* Their reachability. */
+ Reachedness loss_mode;
+ /* Number of blocks and total # bytes involved. */
+ SizeT total_bytes;
+ SizeT indirect_bytes;
+ UInt num_blocks;
+ }
+ LossRecord;
+
extern void MC_(do_detect_memory_leaks) (
ThreadId tid, LeakCheckMode mode,
Bool (*is_within_valid_secondary) ( Addr ),
Bool (*is_valid_aligned_word) ( Addr )
);
=20
+extern void MC_(pp_LeakError)(UInt n_this_record, UInt n_total_records,
+ LossRecord* l);
+ =20
+
/*------------------------------------------------------------*/
+/*--- Errors and suppressions ---*/
+/*------------------------------------------------------------*/
+
+extern void MC_(record_free_error) ( ThreadId tid, Addr a );=20
+extern void MC_(record_illegal_mempool_error) ( ThreadId tid, Addr a );
+extern void MC_(record_freemismatch_error) ( ThreadId tid, MC_Chunk* =
mc );
+extern Bool MC_(record_leak_error) ( ThreadId tid,
+ UInt n_this_record,
+ UInt n_total_records,
+ LossRecord* lossRecord,
+ Bool print_record );
+
+/*------------------------------------------------------------*/
/*--- Command line options + defaults ---*/
/*------------------------------------------------------------*/
=20
Modified: trunk/memcheck/mc_leakcheck.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/mc_leakcheck.c 2006-12-15 04:37:25 UTC (rev 6401)
+++ trunk/memcheck/mc_leakcheck.c 2006-12-16 00:54:12 UTC (rev 6402)
@@ -109,21 +109,6 @@
/*--- Detecting leaked (unreachable) malloc'd blocks. ---*/
/*------------------------------------------------------------*/
=20
-/* A block is either=20
- -- Proper-ly reached; a pointer to its start has been found
- -- Interior-ly reached; only an interior pointer to it has been found
- -- Unreached; so far, no pointers to any part of it have been found.=20
- -- IndirectLeak; leaked, but referred to by another leaked block
-*/
-typedef=20
- enum {=20
- Unreached =3D0,=20
- IndirectLeak =3D1,
- Interior =3D2,=20
- Proper =3D3
- }
- Reachedness;
-
/* An entry in the mark stack */
typedef=20
struct {
@@ -133,30 +118,6 @@
}=20
MarkStack;
=20
-/* A block record, used for generating err msgs. */
-typedef
- struct _LossRecord {
- struct _LossRecord* next;
- /* Where these lost blocks were allocated. */
- ExeContext* allocated_at;
- /* Their reachability. */
- Reachedness loss_mode;
- /* Number of blocks and total # bytes involved. */
- SizeT total_bytes;
- SizeT indirect_bytes;
- UInt num_blocks;
- }
- LossRecord;
-
-/* The 'extra' struct for leak errors. */
-typedef=20
- struct {
- UInt n_this_record;
- UInt n_total_records;
- LossRecord* lossRecord;
- }
- LeakExtra;
-
/* Find the i such that ptr points at or inside the block described by
shadows[i]. Return -1 if none found. This assumes that shadows[]
has been sorted on the ->data field. */
@@ -175,7 +136,7 @@
for (i =3D 0; i < n_shadows; i++) {
PROF_EVENT(71, "find_shadow_for_OLD(loop)");
a_lo =3D shadows[i]->data;
- a_hi =3D ((Addr)shadows[i]->data) + shadows[i]->size;
+ a_hi =3D ((Addr)shadows[i]->data) + shadows[i]->szB;
if (a_lo <=3D ptr && ptr < a_hi)
return i;
}
@@ -201,14 +162,14 @@
=20
mid =3D (lo + hi) / 2;
a_mid_lo =3D shadows[mid]->data;
- a_mid_hi =3D shadows[mid]->data + shadows[mid]->size;
+ a_mid_hi =3D shadows[mid]->data + shadows[mid]->szB;
/* Extent of block 'mid' is [a_mid_lo .. a_mid_hi).
Special-case zero-sized blocks - treat them as if they had
size 1. Not doing so causes them to not cover any address
range at all and so will never be identified as the target of
any pointer, which causes them to be incorrectly reported as
definitely leaked. */
- if (shadows[mid]->size =3D=3D 0)
+ if (shadows[mid]->szB =3D=3D 0)
a_mid_hi++;
=20
if (ptr < a_mid_lo) {
@@ -243,84 +204,7 @@
static Bool (*lc_is_within_valid_secondary) (Addr addr);
static Bool (*lc_is_valid_aligned_word) (Addr addr);
=20
-static const HChar* str_lossmode ( Reachedness lossmode )
-{
- const HChar *loss =3D "?";
- switch (lossmode) {
- case Unreached: loss =3D "definitely lost"; break;
- case IndirectLeak: loss =3D "indirectly lost"; break;
- case Interior: loss =3D "possibly lost"; break;
- case Proper: loss =3D "still reachable"; break;
- }
- return loss;
-}
=20
-static const HChar* xml_kind ( Reachedness lossmode )
-{
- const HChar *loss =3D "?";
- switch (lossmode) {
- case Unreached: loss =3D "Leak_DefinitelyLost"; break;
- case IndirectLeak: loss =3D "Leak_IndirectlyLost"; break;
- case Interior: loss =3D "Leak_PossiblyLost"; break;
- case Proper: loss =3D "Leak_StillReachable"; break;
- }
- return loss;
-}
-
-
-/* Used for printing leak errors, avoids exposing the LossRecord type (w=
hich
- comes in as void*, requiring a cast. */
-void MC_(pp_LeakError)(void* vextra)
-{
- HChar* xpre =3D VG_(clo_xml) ? " <what>" : "";
- HChar* xpost =3D VG_(clo_xml) ? "</what>" : "";
-
- LeakExtra* extra =3D (LeakExtra*)vextra;
- LossRecord* l =3D extra->lossRecord;
- const Char *loss =3D str_lossmode(l->loss_mode);
-
- if (VG_(clo_xml)) {
- VG_(message)(Vg_UserMsg, " <kind>%t</kind>", xml_kind(l->loss_mod=
e));
- } else {
- VG_(message)(Vg_UserMsg, "");
- }
-
- if (l->indirect_bytes) {
- VG_(message)(Vg_UserMsg,=20
- "%s%,lu (%,lu direct, %,lu indirect) bytes in %,u blocks"
- " are %s in loss record %,u of %,u%s",
- xpre,
- l->total_bytes + l->indirect_bytes,=20
- l->total_bytes, l->indirect_bytes, l->num_blocks,
- loss, extra->n_this_record, extra->n_total_records,
- xpost
- );
- if (VG_(clo_xml)) {
- // Nb: don't put commas in these XML numbers=20
- VG_(message)(Vg_UserMsg, " <leakedbytes>%lu</leakedbytes>",=20
- l->total_bytes + l->indirect_bytes);
- VG_(message)(Vg_UserMsg, " <leakedblocks>%u</leakedblocks>",=20
- l->num_blocks);
- }
- } else {
- VG_(message)(
- Vg_UserMsg,=20
- "%s%,lu bytes in %,u blocks are %s in loss record %,u of %,u%s"=
,
- xpre,
- l->total_bytes, l->num_blocks,
- loss, extra->n_this_record, extra->n_total_records,
- xpost
- );
- if (VG_(clo_xml)) {
- VG_(message)(Vg_UserMsg, " <leakedbytes>%d</leakedbytes>",=20
- l->total_bytes);
- VG_(message)(Vg_UserMsg, " <leakedblocks>%d</leakedblocks>",=20
- l->num_blocks);
- }
- }
- VG_(pp_ExeContext)(l->allocated_at);
-}
-
SizeT MC_(bytes_leaked) =3D 0;
SizeT MC_(bytes_indirect) =3D 0;
SizeT MC_(bytes_dubious) =3D 0;
@@ -356,13 +240,13 @@
tl_assert(sh_no >=3D 0 && sh_no < lc_n_shadows);
tl_assert(ptr >=3D lc_shadows[sh_no]->data);
tl_assert(ptr < lc_shadows[sh_no]->data=20
- + lc_shadows[sh_no]->size
- + (lc_shadows[sh_no]->size=3D=3D0 ? 1 : 0));
+ + lc_shadows[sh_no]->szB
+ + (lc_shadows[sh_no]->szB=3D=3D0 ? 1 : 0));
=20
if (lc_markstack[sh_no].state =3D=3D Unreached) {
if (0)
VG_(printf)("pushing %p-%p\n", lc_shadows[sh_no]->data,=20
- lc_shadows[sh_no]->data + lc_shadows[sh_no]->size);
+ lc_shadows[sh_no]->data + lc_shadows[sh_no]->szB);
=20
tl_assert(lc_markstack[sh_no].next =3D=3D -1);
lc_markstack[sh_no].next =3D lc_markstack_top;
@@ -391,13 +275,13 @@
if (lc_markstack[sh_no].indirect)
VG_(printf)(" clique %d joining clique %d adding %d+%d bytes\n",=20
sh_no, clique,=20
- lc_shadows[sh_no]->size, lc_markstack[sh_no].indirect);
+ lc_shadows[sh_no]->szB, lc_markstack[sh_no].indirect);
else
VG_(printf)(" %d joining %d adding %d\n",=20
- sh_no, clique, lc_shadows[sh_no]->size);
+ sh_no, clique, lc_shadows[sh_no]->szB);
}
=20
- lc_markstack[clique].indirect +=3D lc_shadows[sh_no]->size;
+ lc_markstack[clique].indirect +=3D lc_shadows[sh_no]->szB;
lc_markstack[clique].indirect +=3D lc_markstack[sh_no].indirect;
lc_markstack[sh_no].indirect =3D 0; /* shouldn't matter */
}
@@ -503,7 +387,7 @@
tl_assert(top >=3D 0 && top < lc_n_shadows); =20
tl_assert(lc_markstack[top].state !=3D Unreached);
=20
- lc_scan_memory_WRK(lc_shadows[top]->data, lc_shadows[top]->size, c=
lique);
+ lc_scan_memory_WRK(lc_shadows[top]->data, lc_shadows[top]->szB, cl=
ique);
}
}
=20
@@ -520,7 +404,6 @@
LossRecord* errlist;
LossRecord* p;
Bool is_suppressed;
- LeakExtra leak_extra;
=20
/* Go through and group lost structures into cliques. For each
Unreached block, push it onto the mark stack, and find all the
@@ -530,8 +413,8 @@
pass), then the cliques are merged. */
for (i =3D 0; i < lc_n_shadows; i++) {
if (VG_DEBUG_CLIQUE)
- VG_(printf)("cliques: %d at %p -> %s\n",
- i, lc_shadows[i]->data, str_lossmode(lc_markstack[i].state));
+ VG_(printf)("cliques: %d at %p -> Loss state %d\n",
+ i, lc_shadows[i]->data, lc_markstack[i].state);
if (lc_markstack[i].state !=3D Unreached)
continue;
=20
@@ -578,14 +461,14 @@
}
if (p !=3D NULL) {
p->num_blocks ++;
- p->total_bytes +=3D lc_shadows[i]->size;
+ p->total_bytes +=3D lc_shadows[i]->szB;
p->indirect_bytes +=3D lc_markstack[i].indirect;
} else {
n_lossrecords ++;
p =3D VG_(malloc)(sizeof(LossRecord));
p->loss_mode =3D lc_markstack[i].state;
p->allocated_at =3D where;
- p->total_bytes =3D lc_shadows[i]->size;
+ p->total_bytes =3D lc_shadows[i]->szB;
p->indirect_bytes =3D lc_markstack[i].indirect;
p->num_blocks =3D 1;
p->next =3D errlist;
@@ -619,11 +502,8 @@
// Nb: because VG_(unique_error) does all the error processing
// immediately, and doesn't save the error, leakExtra can be
// stack-allocated.
- leak_extra.n_this_record =3D i+1;
- leak_extra.n_total_records =3D n_lossrecords;
- leak_extra.lossRecord =3D p_min;
is_suppressed =3D=20
- MC_(record_leak_error) ( tid, &leak_extra, p_min->allocated_at,
+ MC_(record_leak_error) ( tid, i+1, n_lossrecords, p_min,
print_record );
=20
if (is_suppressed) {
@@ -659,7 +539,7 @@
Int i;
=20
for(i =3D 0; i < lc_n_shadows; i++) {
- SizeT size =3D lc_shadows[i]->size;
+ SizeT size =3D lc_shadows[i]->szB;
=20
switch(lc_markstack[i].state) {
case Unreached:
@@ -745,8 +625,8 @@
}
=20
/* Possibly invalidate the malloc holding the end of this chunk=
. */
- if (mc->size > 1) {
- m =3D find_shadow_for(mc->data + (mc->size - 1), mallocs, n_=
mallocs);
+ if (mc->szB > 1) {
+ m =3D find_shadow_for(mc->data + (mc->szB - 1), mallocs, n_m=
allocs);
if (m !=3D -1 && malloc_chunk_holds_a_pool_chunk[m] =3D=3D F=
alse) {
tl_assert(*n_shadows > 0);
--(*n_shadows);
@@ -814,7 +694,7 @@
=20
/* Sanity check -- make sure they don't overlap */
for (i =3D 0; i < lc_n_shadows-1; i++) {
- tl_assert( lc_shadows[i]->data + lc_shadows[i]->size
+ tl_assert( lc_shadows[i]->data + lc_shadows[i]->szB
<=3D lc_shadows[i+1]->data );
}
=20
@@ -834,7 +714,7 @@
=20
lc_min_mallocd_addr =3D lc_shadows[0]->data;
lc_max_mallocd_addr =3D lc_shadows[lc_n_shadows-1]->data
- + lc_shadows[lc_n_shadows-1]->size;
+ + lc_shadows[lc_n_shadows-1]->szB;
=20
lc_markstack =3D VG_(malloc)( lc_n_shadows * sizeof(*lc_markstack) );
for (i =3D 0; i < lc_n_shadows; i++) {
Modified: trunk/memcheck/mc_main.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/memcheck/mc_main.c 2006-12-15 04:37:25 UTC (rev 6401)
+++ trunk/memcheck/mc_main.c 2006-12-16 00:54:12 UTC (rev 6402)
@@ -1138,9 +1138,10 @@
// Forward declarations
static void mc_record_address_error ( ThreadId tid, Addr a,
Int size, Bool isWrite );
-static void mc_record_core_mem_error ( ThreadId tid, Bool isUnaddr, Char=
* s );
-static void mc_record_param_error ( ThreadId tid, Addr a, Bool isReg,
- Bool isUnaddr, Char* msg );
+static void mc_record_core_mem_error ( ThreadId tid, Bool isAddrErr, Cha=
r* s );
+static void mc_record_regparam_error ( ThreadId tid, Char* msg );
+static void mc_record_memparam_error ( ThreadId tid, Addr a,
+ Bool isAddrErr, Char* msg );
static void mc_record_jump_error ( ThreadId tid, Addr a );
=20
static
@@ -1303,8 +1304,7 @@
tl_assert(nBits =3D=3D 64 || nBits =3D=3D 32 || nBits =3D=3D 16 || nB=
its =3D=3D 8);
=20
/* Dump vbytes in memory, iterating from least to most significant
- byte. At the same time establish addressibility of the
- location. */
+ byte. At the same time establish addressibility of the location. =
*/
for (i =3D 0; i < szB; i++) {
PROF_EVENT(36, "mc_STOREVn_slow(loop)");
ai =3D a + byte_offset_w(szB, bigendian, i);
@@ -2464,12 +2464,11 @@
if (!ok) {
switch (part) {
case Vg_CoreSysCall:
- mc_record_param_error ( tid, bad_addr, /*isReg*/False,
- /*isUnaddr*/True, s );
+ mc_record_memparam_error ( tid, bad_addr, /*isAddrErr*/True, s =
);
break;
=20
case Vg_CoreSignal:
- mc_record_core_mem_error( tid, /*isUnaddr*/True, s );
+ mc_record_core_mem_error( tid, /*isAddrErr*/True, s );
break;
=20
default:
@@ -2486,18 +2485,13 @@
MC_ReadResult res =3D is_mem_defined ( base, size, &bad_addr );
=20
if (MC_Ok !=3D res) {
- Bool isUnaddr =3D ( MC_AddrErr =3D=3D res ? True : False );
+ Bool isAddrErr =3D ( MC_AddrErr =3D=3D res ? True : False );
=20
switch (part) {
case Vg_CoreSysCall:
- mc_record_param_error ( tid, bad_addr, /*isReg*/False,
- isUnaddr, s );
+ mc_record_memparam_error ( tid, bad_addr, isAddrErr, s );
break;
=20
- case Vg_CoreClientReq: // Kludge: make this a CoreMemErr
- mc_record_core_mem_error( tid, isUnaddr, s );
- break;
-
/* If we're being asked to jump to a silly address, record an erro=
r=20
message before potentially crashing the entire system. */
case Vg_CoreTranslate:
@@ -2520,8 +2514,8 @@
tl_assert(part =3D=3D Vg_CoreSysCall);
res =3D mc_is_defined_asciiz ( (Addr)str, &bad_addr );
if (MC_Ok !=3D res) {
- Bool isUnaddr =3D ( MC_AddrErr =3D=3D res ? True : False );
- mc_record_param_error ( tid, bad_addr, /*isReg*/False, isUnaddr, s=
);
+ Bool isAddrErr =3D ( MC_AddrErr =3D=3D res ? True : False );
+ mc_record_memparam_error ( tid, bad_addr, isAddrErr, s );
}
}
=20
@@ -2609,104 +2603,188 @@
}
=20
if (bad)
- mc_record_param_error ( tid, 0, /*isReg*/True, /*isUnaddr*/False, =
s );
+ mc_record_regparam_error ( tid, s );
}
=20
=20
/*------------------------------------------------------------*/
-/*--- Error and suppression types ---*/
+/*--- Error types ---*/
/*------------------------------------------------------------*/
=20
+// Different kinds of blocks.
+typedef enum {
+ Block_Mallocd =3D 111,
+ Block_Freed,
+ Block_Mempool,
+ Block_MempoolChunk,
+ Block_UserG
+} BlockKind;
+
+/* ------------------ Addresses -------------------- */
+
/* The classification of a faulting address. */
typedef=20
enum {=20
- Undescribed, // as-yet unclassified
- Stack,=20
- Unknown, // classification yielded nothing useful
- Freed, Mallocd,=20
- UserG, // in a user-defined block
- Mempool, // in a mempool
- Register, // in a register; for Param errors only
+ Addr_Undescribed, // as-yet unclassified
+ Addr_Unknown, // classification yielded nothing useful
+ Addr_Stack, =20
+ Addr_Block,
}
- AddrKind;
+ AddrTag;
=20
-/* Records info about a faulting address. */
typedef
- struct { // Used by:
- AddrKind akind; // ALL
- SizeT blksize; // Freed, Mallocd
- OffT rwoffset; // Freed, Mallocd
- ExeContext* lastchange; // Freed, Mallocd
- ThreadId stack_tid; // Stack
- const Char *desc; // UserG
- Bool maybe_gcc; // True if just below %esp -- could be a g=
cc bug.
- }
+ struct _AddrInfo
AddrInfo;
=20
-typedef=20
- enum {=20
- ParamSupp, // Bad syscall params
- UserSupp, // Errors arising from client-request checks
- CoreMemSupp, // Memory errors in core (pthread ops, signal handl=
ing)
+struct _AddrInfo {
+ AddrTag tag;
+ union {
+ // As-yet unclassified.
+ struct { } Undescribed;
=20
- // Use of invalid values of given size (MemCheck only)
- Value0Supp, Value1Supp, Value2Supp, Value4Supp, Value8Supp, Value1=
6Supp,
+ // On a stack.
+ struct {
+ ThreadId tid; // Which thread's stack?
+ } Stack;
=20
- // Invalid read/write attempt at given size
- Addr1Supp, Addr2Supp, Addr4Supp, Addr8Supp, Addr16Supp,
+ // This covers heap blocks (normal and from mempools) and user-def=
ined
+ // blocks.
+ struct {
+ BlockKind block_kind;
+ Char* block_desc; // "block", "mempool" or user-define=
d
+ SizeT block_szB;
+ OffT rwoffset;
+ ExeContext* lastchange;
+ } Block;
=20
- FreeSupp, // Invalid or mismatching free
- OverlapSupp, // Overlapping blocks in memcpy(), strcpy(), etc
- LeakSupp, // Something to be suppressed in a leak check.
- MempoolSupp, // Memory pool suppression.
- }=20
- MC_SuppKind;
+ // Classification yielded nothing useful.
+ struct { } Unknown;
=20
+ } Addr;
+};
+
+/* ------------------ Errors ----------------------- */
+
/* What kind of error it is. */
typedef=20
- enum { ValueErr,
- CoreMemErr, // Error in core op (pthread, signals) or client=
req
- AddrErr,=20
- ParamErr, UserErr, /* behaves like an anonymous ParamErr */
- FreeErr, FreeMismatchErr,
- OverlapErr,
- LeakErr,
- IllegalMempoolErr,
+ enum {=20
+ Err_Value,
+ Err_Cond,
+ Err_CoreMem,
+ Err_Addr,=20
+ Err_Jump,=20
+ Err_RegParam,
+ Err_MemParam,
+ Err_User,
+ Err_Free,
+ Err_FreeMismatch,
+ Err_Overlap,
+ Err_Leak,
+ Err_IllegalMempool,
}
- MC_ErrorKind;
+ MC_ErrorTag;
=20
-/* What kind of memory access is involved in the error? */
-typedef
- enum { ReadAxs, WriteAxs, ExecAxs }
- AxsKind;
=20
-/* Extra context for memory errors */
-typedef
- struct { // Used by:
- AxsKind axskind; // AddrErr
- Int size; // AddrErr, ValueErr
- AddrInfo addrinfo; // {Addr,Free,FreeMismatch,Param,User}Err
- Bool isUnaddr; // {CoreMem,Param,User}Err
- }
- MC_Error;
+typedef struct _MC_Error MC_Error;
=20
+struct _MC_Error {
+ // Nb: we don't need the tag here, as it's stored in the Error type! =
Yuk.
+ //MC_ErrorTag tag;
+
+ union {
+ // Use of an undefined value:
+ // - as a pointer in a load or store
+ // - as a jump target
+ struct {
+ SizeT szB; // size of value in bytes
+ } Value;
+
+ // Use of an undefined value in a conditional branch or move.
+ struct {
+ } Cond;
+
+ // Addressability error in core (signal-handling) operation.
+ // It would be good to get rid of this error kind, merge it with
+ // another one somehow.
+ struct {
+ } CoreMem;
+
+ // Use of an unaddressable memory location in a load or store.
+ struct {
+ Bool isWrite; // read or write?
+ SizeT szB; // not used for exec (jump) errors
+ Bool maybe_gcc; // True if just below %esp -- could be a g=
cc bug
+ AddrInfo ai;
+ } Addr;
+
+ // Jump to an unaddressable memory location.
+ struct {
+ AddrInfo ai;
+ } Jump;
+
+ // System call register input contains undefined bytes.
+ struct {
+ } RegParam;
+
+ // System call memory input contains undefined/unaddressable bytes
+ struct {
+ Bool isAddrErr; // Addressability or definedness error?
+ AddrInfo ai;
+ } MemParam;
+
+ // Problem found from a client request like CHECK_MEM_IS_ADDRESSAB=
LE.
+ struct {
+ Bool isAddrErr; // Addressability or definedness error?
+ AddrInfo ai;
+ } User;
+
+ // Program tried to free() something that's not a heap block (this
+ // covers double-frees). */
+ struct {
+ AddrInfo ai;
+ } Free;
+
+ // Program allocates heap block with one function
+ // (malloc/new/new[]/custom) and deallocates with not the matching=
one.
+ struct {
+ AddrInfo ai;
+ } FreeMismatch;
+
+ // Call to strcpy, memcpy, etc, with overlapping blocks.
+ struct {
+ Addr src; // Source block
+ Addr dst; // Destination block
+ Int szB; // Size in bytes; 0 if unused.
+ } Overlap;
+
+ // A memory leak.
+ struct {
+ UInt n_this_record;
+ UInt n_total_records;
+ LossRecord* lossRecord;
+ } Leak;
+
+ // A memory pool error.
+ struct {
+ AddrInfo ai;
+ } IllegalMempool;
+
+ } Err;
+};
+
+
/*------------------------------------------------------------*/
/*--- Printing errors ---*/
/*------------------------------------------------------------*/
=20
-static void mc_pp_AddrInfo ( Addr a, AddrInfo* ai )
+static void mc_pp_AddrInfo ( Addr a, AddrInfo* ai, Bool maybe_gcc )
{
HChar* xpre =3D VG_(clo_xml) ? " <auxwhat>" : " ";
HChar* xpost =3D VG_(clo_xml) ? "</auxwhat>" : "";
=20
- switch (ai->akind) {
- case Stack:=20
- VG_(message)(Vg_UserMsg,=20
- "%sAddress 0x%llx is on thread %d's stack%s",=20
- xpre, (ULong)a, ai->stack_tid, xpost);
- break;
- case Unknown:
- if (ai->maybe_gcc) {
+ switch (ai->tag) {
+ case Addr_Unknown:
+ if (maybe_gcc) {
VG_(message)(Vg_UserMsg,=20
"%sAddress 0x%llx is just below the stack ptr. "
"To suppress, use: --workaround-gcc296-bugs=3Dyes%s",
@@ -2719,200 +2797,246 @@
xpre, (ULong)a, xpost);
}
break;
- case Freed: case Mallocd: case UserG: case Mempool: {
+
+ case Addr_Stack:=20
+ VG_(message)(Vg_UserMsg,=20
+ "%sAddress 0x%llx is on thread %d's stack%s",=20
+ xpre, (ULong)a, ai->Addr.Stack.tid, xpost);
+ break;
+
+ case Addr_Block: {
+ SizeT block_szB =3D ai->Addr.Block.block_szB;
+ OffT rwoffset =3D ai->Addr.Block.rwoffset;
SizeT delta;
const Char* relative;
- const Char* kind;
- if (ai->akind =3D=3D Mempool) {
- kind =3D "mempool";
- } else {
- kind =3D "block";
- }
- if (ai->desc !=3D NULL)
- kind =3D ai->desc;
=20
- if (ai->rwoffset < 0) {
- delta =3D (SizeT)(- ai->rwoffset);
+ if (rwoffset < 0) {
+ delta =3D (SizeT)(-rwoffset);
relative =3D "before";
- } else if (ai->rwoffset >=3D ai->blksize) {
- delta =3D ai->rwoffset - ai->blksize;
+ } else if (rwoffset >=3D block_szB) {
+ delta =3D rwoffset - block_szB;
relative =3D "after";
} else {
- delta =3D ai->rwoffset;
+ delta =3D rwoffset;
relative =3D "inside";
}
VG_(message)(Vg_UserMsg,=20
"%sAddress 0x%lx is %,lu bytes %s a %s of size %,lu %s%s",
xpre,
- a, delta, relative, kind,
- ai->blksize,
- ai->akind=3D=3DMallocd ? "alloc'd"=20
- : ai->akind=3D=3DFreed ? "free'd"=20
- : "client-defined",
+ a, delta, relative, ai->Addr.Block.block_desc,
+ block_szB,
+ ai->Addr.Block.block_kind=3D=3DBlock_Mallocd ? "alloc'd"=20
+ : ai->Addr.Block.block_kind=3D=3DBlock_Freed ? "free'd"=20
+ : "client-defined",
xpost);
- VG_(pp_ExeContext)(ai->lastchange);
+ VG_(pp_ExeContext)(ai->Addr.Block.lastchange);
break;
}
- case Register:
- // print nothing
- tl_assert(0 =3D=3D a);
- break;
+
default:
VG_(tool_panic)("mc_pp_AddrInfo");
}
}
=20
-static void mc_pp_Error ( Error* err )
+static const HChar* str_leak_lossmode ( Reachedness lossmode )
{
- MC_Error* err_extra =3D VG_(get_error_extra)(err);
+ const HChar *loss =3D "?";
+ switch (lossmode) {
+ case Unreached: loss =3D "definitely lost"; break;
+ case IndirectLeak: loss =3D "indirectly lost"; break;
+ case Interior: loss =3D "possibly lost"; break;
+ case Proper: loss =3D "still reachable"; break;
+ }
+ return loss;
+}
=20
+static const HChar* xml_leak_kind ( Reachedness lossmode )
+{
+ const HChar *loss =3D "?";
+ switch (lossmode) {
+ case Unreached: loss =3D "Leak_DefinitelyLost"; break;
+ case IndirectLeak: loss =3D "Leak_IndirectlyLost"; break;
+ case Interior: loss =3D "Leak_PossiblyLost"; break;
+ case Proper: loss =3D "Leak_StillReachable"; break;
+ }
+ return loss;
+}
+
+static void mc_pp_msg( Char* xml_name, Error* err, const HChar* format, =
... )
+{
HChar* xpre =3D VG_(clo_xml) ? " <what>" : "";
HChar* xpost =3D VG_(clo_xml) ? "</what>" : "";
+ Char buf[256];
+ va_list vargs;
=20
+ if (VG_(clo_xml))
+ VG_(message)(Vg_UserMsg, " <kind>%s</kind>", xml_name);
+ // Stick xpre and xpost on the front and back of the format string.
+ VG_(snprintf)(buf, 256, "%s%s%s", xpre, format, xpost);
+ va_start(vargs, format);
+ VG_(vmessage) ( Vg_UserMsg, buf, vargs );
+ va_end(vargs);
+ VG_(pp_ExeContext)( VG_(get_error_where)(err) );
+}
+
+static void mc_pp_Error ( Error* err )
+{
+ MC_Error* extra =3D VG_(get_error_extra)(err);
+
switch (VG_(get_error_kind)(err)) {
- case CoreMemErr: {
- Char* s =3D ( err_extra->isUnaddr ? "unaddressable" : "uninitia=
lised" );
- if (VG_(clo_xml))
- VG_(message)(Vg_UserMsg, " <kind>CoreMemError</kind>");
- /* What the hell *is* a CoreMemError? jrs 2005-May-18 */
- VG_(message)(Vg_UserMsg, "%s%s contains %s byte(s)%s",=20
- xpre, VG_(get_error_string)(err), s, xpost);
-
- VG_(pp_ExeContext)( VG_(get_error_where)(err) );
+ case Err_CoreMem: {
+ /* What the hell *is* a CoreMemError? jrs 2005-May-18 */
+ /* As of 2006-Dec-14, it's caused by unaddressable bytes in a
+ signal handler frame. --njn */
+ mc_pp_msg("CoreMemError", err,
+ "%s contains unaddressable byte(s)",=20
+ VG_(get_error_string)(err));
break;
- =20
}=20
=20
- case ValueErr:
- if (err_extra->size =3D=3D 0) {
- if (VG_(clo_xml))
- VG_(message)(Vg_UserMsg, " <kind>UninitCondition</kind>"=
);
- VG_(message)(Vg_UserMsg, "%sConditional jump or move depends=
"
- " on uninitialised value(s)%s",=20
- xpre, xpost);
- } else {
- if (VG_(clo_xml))
- VG_(message)(Vg_UserMsg, " <kind>UninitValue</kind>");
- VG_(message)(Vg_UserMsg,
- "%sUse of uninitialised value of size %d%s",
- xpre, err_extra->size, xpost);
- }
- VG_(pp_ExeContext)( VG_(get_error_where)(err) );
+ case Err_Value:
+ mc_pp_msg("UninitValue", err,
+ "Use of uninitialised value of size %d",
+ extra->Err.Value.szB);
break;
=20
- case ParamErr: {
- Bool isReg =3D ( Register =3D=3D err_extra->addrinfo.akind );
- Char* s1 =3D ( isReg ? "contains" : "points to" );
- Char* s2 =3D ( err_extra->isUnaddr ? "unaddressable" : "uniniti=
alised" );
- if (isReg) tl_assert(!err_extra->isUnaddr);
+ case Err_Cond:
+ mc_pp_msg("UninitCondition", err,
+ "Conditional jump or move depends"
+ " on uninitialised value(s)");
+ break;
=20
- if (VG_(clo_xml))
- VG_(message)(Vg_UserMsg, " <kind>SyscallParam</kind>");
- VG_(message)(Vg_UserMsg, "%sSyscall param %s %s %s byte(s)%s",
- xpre, VG_(get_error_string)(err), s1, s2, xpost);
+ case Err_RegParam:
+ mc_pp_msg("SyscallParam", err,
+ "Syscall param %s contains uninitialised byte(s)",
+ VG_(get_error_string)(err));
+ break;
=20
- VG_(pp_ExeContext)( VG_(get_error_where)(err) );
- mc_pp_AddrInfo(VG_(get_error_address)(err), &err_extra->addrinf=
o);
+ case Err_MemParam:
+ mc_pp_msg("SyscallParam", err,
+ "Syscall param %s points to %s byte(s)",
+ VG_(get_error_string)(err),
+ ( extra->Err.MemParam.isAddrErr=20
+ ? "unaddressable" : "uninitialised" ));
+ mc_pp_AddrInfo(VG_(get_error_address)(err),
+ &extra->Err.MemParam.ai, False);
break;
- }
- case UserErr: {
- Char* s =3D ( err_extra->isUnaddr ? "Unaddressable" : "Uninitia=
lised" );
=20
- if (VG_(clo_xml))
- VG_(message)(Vg_UserMsg, " <kind>ClientCheck</kind>");
- VG_(message)(Vg_UserMsg,=20
- "%s%s byte(s) found during client check request%s",=20
- xpre, s, xpost);
+ case Err_User:
+ mc_pp_msg("ClientCheck", err,
+ "%s byte(s) found during client check request",=20
+ ( extra->Err.User.isAddrErr
+ ? "Unaddressable" : "Uninitialised" ));
+ mc_pp_AddrInfo(VG_(get_error_address)(err), &extra->Err.User.ai=
,
+ False);
+ break;
=20
- VG_(pp_ExeContext)( VG_(get_error_where)(err) );
- mc_pp_AddrInfo(VG_(get_error_address)(err), &err_extra->addrinf=
o);
+ case Err_Free:
+ mc_pp_msg("InvalidFree", err,
+ "Invalid free() / delete / delete[]");
+ mc_pp_AddrInfo(VG_(get_error_address)(err),
+ &extra->Err.Free.ai, False);
break;
- }
- case FreeErr:
- if (VG_(clo_xml))
- VG_(message)(Vg_UserMsg, " <kind>InvalidFree</kind>");
- VG_(message)(Vg_UserMsg,=20
- "%sInvalid free() / delete / delete[]%s",
- xpre, xpost);
- VG_(pp_ExeContext)( VG_(get_error_where)(err) );
- mc_pp_AddrInfo(VG_(get_error_address)(err), &err_extra->addrinf=
o);
- break;
=20
- case FreeMismatchErr:
- if (VG_(clo_xml))
- VG_(message)(Vg_UserMsg, " <kind>MismatchedFree</kind>");
- VG_(message)(Vg_UserMsg,=20
- "%sMismatched free() / delete / delete []%s",
- xpre, xpost);
- VG_(pp_ExeContext)( VG_(get_error_where)(err) );
- mc_pp_AddrInfo(VG_(get_error_address)(err), &err_extra->addrinf=
o);
+ case Err_FreeMismatch:
+ mc_pp_msg("MismatchedFree", err,
+ "Mismatched free() / delete / delete []");
+ mc_pp_AddrInfo(VG_(get_error_address)(err),
+ &extra->Err.FreeMismatch.ai, False);
break;
=20
- case AddrErr:
- switch (err_extra->axskind) {
- case ReadAxs:
- if (VG_(clo_xml))
- VG_(message)(Vg_UserMsg, " <kind>InvalidRead</kind>")=
;
- VG_(message)(Vg_UserMsg,
- "%sInvalid read of size %d%s",=20
- xpre, err_extra->size, xpost );=20
- break;
- case WriteAxs:
- if (VG_(clo_xml))
- VG_(message)(Vg_UserMsg, " <kind>InvalidWrite</kind>"=
);
- VG_(message)(Vg_UserMsg,=20
- "%sInvalid write of size %d%s",=20
- xpre, err_extra->size, xpost );=20
- break;
- case ExecAxs:
- if (VG_(clo_xml))
- VG_(message)(Vg_UserMsg, " <kind>InvalidJump</kind>")=
;
- VG_(message)(Vg_UserMsg,=20
- "%sJump to the invalid address "
- "stated on the next line%s",
- xpre, xpost);
- break;
- default:=20
- VG_(tool_panic)("mc_pp_Error(axskind)");
+ case Err_Addr:
+ if (extra->Err.Addr.isWrite) {
+ mc_pp_msg("InvalidWrite", err,
+ "Invalid write of size %d",=20
+ extra->Err.Addr.szB);=20
+ } else {
+ mc_pp_msg("InvalidRead", err,
+ "Invalid read of size %d",=20
+ extra->Err.Addr.szB);=20
}
- VG_(pp_ExeContext)( VG_(get_error_where)(err) );
- mc_pp_AddrInfo(VG_(get_error_address)(err), &err_extra->addrinf=
o);
+ mc_pp_AddrInfo(VG_(get_error_address)(err), &extra->Err.Addr.ai=
,
+ extra->Err.Addr.maybe_gcc);
break;
=20
- case OverlapErr: {
- OverlapExtra* ov_extra =3D (OverlapExtra*)VG_(get_error_extra)(=
err);
- if (VG_(clo_xml))
- VG_(message)(Vg_UserMsg, " <kind>Overlap</kind>");
- if (ov_extra->len =3D=3D -1)
- VG_(message)(Vg_UserMsg,
- "%sSource and destination overlap in %s(%p, %p)=
%s",
- xpre,
- VG_(get_error_string)(err),
- ov_extra->dst, ov_extra->src,
- xpost);
+ case Err_Jump:
+ mc_pp_msg("InvalidJump", err,
+ "Jump to the invalid address stated on the next line"=
);
+ mc_pp_AddrInfo(VG_(get_error_address)(err), &extra->Err.Jump.ai=
,
+ False);
+ break;
+
+ case Err_Overlap:
+ if (extra->Err.Overlap.szB =3D=3D 0)
+ mc_pp_msg("Overlap", err,
+ "Source and destination overlap in %s(%p, %p)",
+ VG_(get_error_string)(err),
+ extra->Err.Overlap.dst, extra->Err.Overlap.src);
else
- VG_(message)(Vg_UserMsg,
- "%sSource and destination overlap in %s(%p, %p,=
%d)%s",
- xpre,
- VG_(get_error_string)(err),
- ov_extra->dst, ov_extra->src, ov_extra->len,
- xpost);
- VG_(pp_ExeContext)( VG_(get_error_where)(err) );
+ mc_pp_msg("Overlap", err,
+ "Source and destination overlap in %s(%p, %p, %d)"=
,
+ VG_(get_error_string)(err),
+ extra->Err.Overlap.dst, extra->Err.Overlap.src,
+ extra->Err.Overlap.szB);
break;
- }
- case LeakErr: {
- MC_(pp_LeakError)(err_extra);
+
+ case Err_IllegalMempool:
+ mc_pp_msg("InvalidMemPool", err,
+ "Illegal memory pool address");
+ mc_pp_AddrInfo(VG_(get_error_address)(err),
+ &extra->Err.IllegalMempool.ai, False);
break;
- }
=20
- case IllegalMempoolErr:
- if (VG_(clo_xml))
- VG_(message)(Vg_UserMsg, " <kind>InvalidMemPool</kind>");
- VG_(message)(Vg_UserMsg, "%sIllegal memory pool address%s",
- xpre, xpost);
- VG_(pp_ExeContext)( VG_(get_error_where)(err) );
- mc_pp_AddrInfo(VG_(get_error_address)(err), &err_extra->addrinf=
o);
+ case Err_Leak: {
+ HChar* xpre =3D VG_(clo_xml) ? " <what>" : "";
+ HChar* xpost =3D VG_(clo_xml) ? "</what>" : "";
+ UInt n_this_record =3D extra->Err.Leak.n_this_record;
+ UInt n_total_records =3D extra->Err.Leak.n_total_records=
;
+ LossRecord* l =3D extra->Err.Leak.lossRecord;
+
+ if (VG_(clo_xml)) {
+ VG_(message)(Vg_UserMsg, " <kind>%t</kind>",
+ xml_leak_kind(l->loss_mode));
+ } else {
+ VG_(message)(Vg_UserMsg, "");
+ }
+
+ if (l->indirect_bytes) {
+ VG_(message)(Vg_UserMsg,=20
+ "%s%,lu (%,lu direct, %,lu indirect) bytes in %,u blocks"
+ " are %s in loss record %,u of %,u%s",
+ xpre,
+ l->total_bytes + l->indirect_bytes,=20
+ l->total_bytes, l->indirect_bytes, l->num_blocks,
+ str_leak_lossmode(l->loss_mode), n_this_record, n_total_r=
ecords,
+ xpost
+ );
+ if (VG_(clo_xml)) {
+ // Nb: don't put commas in these XML numbers=20
+ VG_(message)(Vg_UserMsg, " <leakedbytes>%lu</leakedbytes=
>",=20
+ l->total_bytes + l->indirect_byt=
es);
+ VG_(message)(Vg_UserMsg, " <leakedblocks>%u</leakedblock=
s>",=20
+ l->num_blocks);
+ }
+ } else {
+ VG_(message)(
+ Vg_UserMsg,=20
+ "%s%,lu bytes in %,u blocks are %s in loss record %,u of =
%,u%s",
+ xpre,
+ l->total_bytes, l->num_blocks,
+ str_leak_lossmode(l->loss_mode), n_this_record, n_total_r=
ecords,
+ xpost
+ );
+ if (VG_(clo_xml)) {
+ VG_(message)(Vg_UserMsg, " <leakedbytes>%d</leakedbytes>=
",=20
+ l->total_bytes);
+ VG_(message)(Vg_UserMsg, " <leakedblocks>%d</leakedblock=
s>",=20
+ l->num_blocks);
+ }
+ }
+ VG_(pp_ExeContext)(l->allocated_at);
break;
+ }
=20
default:=20
VG_(printf)("Error:\n unknown Memcheck error code %d\n",
@@ -2939,25 +3063,12 @@
return False;
}
=20
-static void mc_clear_MC_Error ( MC_Error* err_extra )
-{
- err_extra->axskind =3D ReadAxs;
- err_extra->size =3D 0;
- err_extra->isUnaddr =3D True;
- err_extra->addrinfo.akind =3D Unknown;
- err_extra->addrinfo.blksize =3D 0;
- err_extra->addrinfo.rwoffset =3D 0;
- err_extra->addrinfo.lastchange =3D NULL;
- err_extra->addrinfo.stack_tid =3D VG_INVALID_THREADID;
- err_extra->addrinfo.maybe_gcc =3D False;
- err_extra->addrinfo.desc =3D NULL;
-}
+/* --- Called from generated and non-generated code --- */
=20
-/* This one called from generated code and non-generated code. */
-static void mc_record_address_error ( ThreadId tid, Addr a, Int size,
+static void mc_record_address_error ( ThreadId tid, Addr a, Int szB,
Bool isWrite )
{
- MC_Error err_extra;
+ MC_Error extra;
Bool just_below_esp;
=20
if (in_ignored_range(a))=20
@@ -2970,14 +3081,14 @@
best we can do is to 'act normal' and mark the A bits in the
normal way as noaccess, but then hide any reads from that page
that get reported here. */
- if ((!isWrite) && a >=3D 0 && a < 4096 && a+size <=3D 4096)=20
+ if ((!isWrite) && a >=3D 0 && a < 4096 && a+szB <=3D 4096)=20
return;
=20
/* Appalling AIX hack. It suppresses reads done by glink
fragments. Getting rid of this would require figuring out
somehow where the referenced data areas are (and their
sizes). */
- if ((!isWrite) && size =3D=3D sizeof(Word)) {=20
+ if ((!isWrite) && szB =3D=3D sizeof(Word)) {=20
UInt i1, i2;
UInt* pc =3D (UInt*)VG_(get_IP)(tid);
if (sizeof(Word) =3D=3D 4) {
@@ -2999,225 +3110,191 @@
if (MC_(clo_workaround_gcc296_bugs) && just_below_esp)
return;
=20
- mc_clear_MC_Error( &err_extra );
- err_extra.axskind =3D isWrite ? WriteAxs : ReadAxs;
- err_extra.size =3D size;
- err_extra.addrinfo.akind =3D Undescribed;
- err_extra.addrinfo.maybe_gcc =3D just_below_esp;
- VG_(maybe_record_error)( tid, AddrErr, a, /*s*/NULL, &err_extra );
+ extra.Err.Addr.isWrite =3D isWrite;
+ extra.Err.Addr.szB =3D szB;
+ extra.Err.Addr.maybe_gcc =3D just_below_esp;
+ extra.Err.Addr.ai.tag =3D Addr_Undescribed;
+ VG_(maybe_record_error)( tid, Err_Addr, a, /*s*/NULL, &extra );
}
=20
-/* These ones are called from non-generated code */
+static void mc_record_value_error ( ThreadId tid, Int szB )
+{
+ MC_Error extra;
+ tl_assert(MC_(clo_undef_value_errors));
+ extra.Err.Value.szB =3D szB;
+ VG_(maybe_record_error)( tid, Err_Value, /*addr*/0, /*s*/NULL, &extra=
);
+}
=20
+static void mc_record_cond_error ( ThreadId tid )
+{
+ tl_assert(MC_(clo_undef_value_errors));
+ VG_(maybe_record_error)( tid, Err_Cond, /*addr*/0, /*s*/NULL, /*extra=
*/NULL);
+}
+
+/* --- Called from non-generated code --- */
+
/* This is for memory errors in pthread functions, as opposed to pthread=
API
errors which are found by the core. */
-static void mc_record_core_mem_error ( ThreadId tid, Bool isUnaddr, Char=
* msg )
+static void mc_record_core_mem_error ( ThreadId tid, Bool isAddrErr, Cha=
r* msg )
{
- MC_Error err_extra;
+ VG_(maybe_record_error)( tid, Err_CoreMem, /*addr*/0, msg, /*extra*/N=
ULL );
+}
=20
- mc_clear_MC_Error( &err_extra );
- err_extra.isUnaddr =3D isUnaddr;
- VG_(maybe_record_error)( tid, CoreMemErr, /*addr*/0, msg, &err_extra =
);
+static void mc_record_regparam_error ( ThreadId tid, Char* msg )
+{
+ tl_assert(VG_INVALID_THREADID !=3D tid);
+ VG_(maybe_record_error)( tid, Err_RegParam, /*addr*/0, msg, /*extra*/=
NULL );
}
=20
-// Three kinds of param errors:
-// - register arg contains undefined bytes
-// - memory arg is unaddressable
-// - memory arg contains undefined bytes
-// 'isReg' and 'isUnaddr' dictate which of these it is.
-static void mc_record_param_error ( ThreadId tid, Addr a, Bool isReg,
- Bool isUnaddr, Char* msg )
+static void mc_record_memparam_error ( ThreadId tid, Addr a,=20
+ Bool isAddrErr, Char* msg )
{
- MC_Error err_extra;
-
- if (!isUnaddr) tl_assert(MC_(clo_undef_value_errors));
+ MC_Error extra;
tl_assert(VG_INVALID_THREADID !=3D tid);
- if (isUnaddr) tl_assert(!isReg); // unaddressable register is impo=
ssible
- mc_clear_MC_Error( &err_extra );
- err_extra.addrinfo.akind =3D ( isReg ? Register : Undescribed );
- err_extra.isUnaddr =3D isUnaddr;
- VG_(maybe_record_error)( tid, ParamErr, a, msg, &err_extra );
+ if (!isAddrErr)=20
+ tl_assert(MC_(clo_undef_value_errors));
+ extra.Err.MemParam.isAddrErr =3D isAddrErr;
+ extra.Err.MemParam.ai.tag =3D Addr_Undescribed;
+ VG_(maybe_record_error)( tid, Err_MemParam, a, msg, &extra );
}
=20
static void mc_record_jump_error ( ThreadId tid, Addr a )
{
- MC_Error err_extra;
-
+ MC_Error extra;
tl_assert(VG_INVALID_THREADID !=3D tid);
- mc_clear_MC_Error( &err_extra );
- err_extra.axskind =3D ExecAxs;
- err_extra.size =3D 1; // size only used for suppressions
- err_extra.addrinfo.akind =3D Undescribed;
- VG_(maybe_record_error)( tid, AddrErr, a, /*s*/NULL, &err_extra );
+ extra.Err.Jump.ai.tag =3D Addr_Undescribed;
+ VG_(maybe_record_error)( tid, Err_Jump, a, /*s*/NULL, &extra );
}
=20
void MC_(record_free_error) ( ThreadId tid, Addr a )=20
{
- MC_Error err_extra;
-
+ MC_Error extra;
tl_assert(VG_INVALID_THREADID !=3D tid);
- mc_clear_MC_Error( &err_extra );
- err_extra.addrinfo.akind =3D Undescribed;
- VG_(maybe_record_error)( tid, FreeErr, a, /*s*/NULL, &err_extra );
+ extra.Err.Free.ai.tag =3D Addr_Undescribed;
+ VG_(maybe_record_error)( tid, Err_Free, a, /*s*/NULL, &extra );
}
=20
-void MC_(record_illegal_mempool_error) ( ThreadId tid, Addr a )=20
+void MC_(record_freemismatch_error) ( ThreadId tid, MC_Chunk* mc )
{
- MC_Error err_extra;
-
+ MC_Error extra;
+ AddrInfo* ai =3D &extra.Err.FreeMismatch.ai;
tl_assert(VG_INVALID_THREADID !=3D tid);
- mc_clear_MC_Error( &err_extra );
- err_extra.addrinfo.akind =3D Undescribed;
- VG_(maybe_record_error)( tid, IllegalMempoolErr, a, /*s*/NULL, &err_e=
xtra );
+ ai->tag =3D Addr_Block;
+ ai->Addr.Block.block_kind =3D Block_Mallocd; // Nb: Not 'Block_Freed=
'
+ ai->Addr.Block.block_desc =3D "block";
+ ai->Addr.Block.block_szB =3D mc->szB;
+ ai->Addr.Block.rwoffset =3D 0;
+ ai->Addr.Block.lastchange =3D mc->where;
+ VG_(maybe_record_error)( tid, Err_FreeMismatch, mc->data, /*s*/NULL,
+ &extra );
}
=20
-void MC_(record_freemismatch_error) ( ThreadId tid, Addr a, MC_Chunk* mc=
)
+void MC_(record_illegal_mempool_error) ( ThreadId tid, Addr a )=20
{
- MC_Error err_extra;
- AddrInfo* ai;
-
+ MC_Error extra;
tl_assert(VG_INVALID_THREADID !=3D tid);
- mc_clear_MC_Error( &err_extra );
- ai =3D &err_extra.addrinfo;
- ai->akind =3D Mallocd; // Nb: not 'Freed'
- ai->blksize =3D mc->size;
- ai->rwoffset =3D (Int)a - (Int)mc->data;
- ai->lastchange =3D mc->where;
- VG_(maybe_record_error)( tid, FreeMismatchErr, a, /*s*/NULL, &err_ext=
ra );
+ extra.Err.IllegalMempool.ai.tag =3D Addr_Undescribed;
+ VG_(maybe_record_error)( tid, Err_IllegalMempool, a, /*s*/NULL, &extr=
a );
}
=20
-static void mc_record_overlap_error ( ThreadId tid,=20
- Char* function, OverlapExtra* ov_e=
xtra )
+static void mc_record_overlap_error ( ThreadId tid, Char* function,
+ Addr src, Addr dst, SizeT szB )
{
+ MC_Error extra;
+ tl_assert(VG_INVALID_THREADID !=3D tid);
+ extra.Err.Overlap.src =3D src;
+ extra.Err.Overlap.dst =3D dst;
+ extra.Err.Overlap.szB =3D szB;
VG_(maybe_record_error)(=20
- tid, OverlapErr, /*addr*/0, /*s*/function, ov_extra );
+ tid, Err_Overlap, /*addr*/0, /*s*/function, &extra );
}
=20
-Bool MC_(record_leak_error) ( ThreadId tid, /*LeakExtra*/void* leak_extr=
a,
- ExeContext* where, Bool print_record )
+Bool MC_(record_leak_error) ( ThreadId tid, UInt n_this_record,
+ UInt n_total_records, LossRecord* lossReco=
rd,
+ Bool print_record )
{
+ MC_Error extra;
+ extra.Err.Leak.n_this_record =3D n_this_record;
+ extra.Err.Leak.n_total_records =3D n_total_records;
+ extra.Err.Leak.lossRecord =3D lossRecord;
return
- VG_(unique_error) ( tid, LeakErr, /*Addr*/0, /*s*/NULL,
- /*extra*/leak_extra, where, print_record,
+ VG_(unique_error) ( tid, Err_Leak, /*Addr*/0, /*s*/NULL, &extra,
+ lossRecord->allocated_at, print_record,
/*allow_GDB_attach*/False, /*count_error*/False )=
;
}
=20
-
-/* Creates a copy of the 'extra' part, updates the copy with address inf=
o if
- necessary, and returns the copy. */
-/* This one called from generated code and non-generated code. */
-static void mc_record_value_error ( ThreadId tid, Int size )
+static void mc_record_user_error ( ThreadId tid, Addr a, Bool isAddrErr =
)
{
- MC_Error err_extra;
+ MC_Error extra;
=20
- tl_assert(MC_(clo_undef_value_errors));
- mc_clear_MC_Error( &err_extra );
- err_extra.size =3D size;
- err_extra.isUnaddr =3D False;
- VG_(maybe_record_error)( tid, ValueErr, /*addr*/0, /*s*/NULL, &err_ex=
tra );
-}
-
-/* This called from non-generated code */
-
-static void mc_record_user_error ( ThreadId tid, Addr a, Bool isWrite,
- Bool isUnaddr )
-{
- MC_Error err_extra;
-
tl_assert(VG_INVALID_THREADID !=3D tid);
- mc_clear_MC_Error( &err_extra );
- err_extra.addrinfo.akind =3D Undescribed;
- err_extra.isUnaddr =3D isUnaddr;
- VG_(maybe_record_error)( tid, UserErr, a, /*s*/NULL, &err_extra );
+ extra.Err.User.isAddrErr =3D isAddrErr;
+ extra.Err.User.ai.tag =3D Addr_Undescribed;
+ VG_(maybe_record_error)( tid, Err_User, a, /*s*/NULL, &extra );
}
=20
-__attribute__ ((unused))
-static Bool eq_AddrInfo ( VgRes res, AddrInfo* ai1, AddrInfo* ai2 )
-{
- if (ai1->akind !=3D Undescribed=20
- && ai2->akind !=3D Undescribed
- && ai1->akind !=3D ai2->akind)=20
- return False;
- if (ai1->akind =3D=3D...
[truncated message content] |