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
(14) |
2
(16) |
3
(7) |
|
4
(7) |
5
(9) |
6
(8) |
7
(10) |
8
(16) |
9
(15) |
10
(9) |
|
11
(11) |
12
(13) |
13
(8) |
14
(8) |
15
(10) |
16
(25) |
17
(7) |
|
18
(7) |
19
(13) |
20
(10) |
21
(14) |
22
(11) |
23
(12) |
24
(8) |
|
25
(19) |
26
(10) |
27
(16) |
28
(13) |
|
|
|
|
From: <sv...@va...> - 2007-02-27 22:36:16
|
Author: sewardj
Date: 2007-02-27 22:36:14 +0000 (Tue, 27 Feb 2007)
New Revision: 6625
Log:
Track recent XArray changes.
Modified:
trunk/coregrind/m_debuginfo/readxcoff.c
trunk/coregrind/m_initimg/initimg-aix5.c
trunk/coregrind/m_syswrap/syswrap-aix5.c
trunk/memcheck/mc_replace_strmem.c
Modified: trunk/coregrind/m_debuginfo/readxcoff.c
===================================================================
--- trunk/coregrind/m_debuginfo/readxcoff.c 2007-02-27 22:31:45 UTC (rev 6624)
+++ trunk/coregrind/m_debuginfo/readxcoff.c 2007-02-27 22:36:14 UTC (rev 6625)
@@ -52,6 +52,7 @@
#include "pub_core_libcfile.h" /* stat, open, close */
#include "pub_core_aspacemgr.h" /* for mmaping debuginfo files */
#include "pub_core_options.h" /* VG_(clo_trace_symtab) */
+#include "pub_core_xarray.h"
#include "priv_storage.h"
#include "priv_readxcoff.h" /* self */
@@ -568,7 +569,7 @@
add the rest to 'syms'.
---------------------------------------------------------- */
- syms = newXA( malloc_AR_SYMTAB, free_AR_SYMTAB, sizeof(XCoffSym) );
+ syms = VG_(newXA)( malloc_AR_SYMTAB, free_AR_SYMTAB, sizeof(XCoffSym) );
if (SHOW && SHOW_SYMS_P1) {
VG_(printf)("--- BEGIN Phase1 (find text symbol starts) ---\n");
@@ -649,7 +650,7 @@
continue;
if (is_empty_Name(name))
continue;
- addToXA(syms, &cand);
+ (void)VG_(addToXA)(syms, &cand);
}
if (CSECT_SMTYP(aux) == XTY_LD) {
@@ -705,7 +706,7 @@
if (is_empty_Name(name))
continue;
- addToXA(syms, &cand);
+ (void)VG_(addToXA)(syms, &cand);
}
}
/* --- END regular(ish) symbol --- */
@@ -721,7 +722,7 @@
part, is correct.
---------------------------------------------------------- */
- nsyms = sizeXA(syms);
+ nsyms = VG_(sizeXA)(syms);
if (SHOW && SHOW_SYMS_P1)
VG_(printf)("Phase1 acquired %d text symbols\n", nsyms);
@@ -731,8 +732,8 @@
VG_(printf)("--- note: shown addresses are ACTUAL VMAs ---\n");
}
- setCmpFnXA(syms, cmp_XCoffSym_by_start_then_name);
- sortXA(syms);
+ VG_(setCmpFnXA)(syms, cmp_XCoffSym_by_start_then_name);
+ VG_(sortXA)(syms);
/* We only know for sure the start addresses (actual VMAs) of
symbols, and an overestimation of their end addresses. So sort
@@ -755,17 +756,17 @@
for (i = 0; i < nsyms; i++) {
for (k = i+1;
k < nsyms
- && ((XCoffSym*)indexXA(syms,i))->first
- == ((XCoffSym*)indexXA(syms,k))->first;
+ && ((XCoffSym*)VG_(indexXA)(syms,i))->first
+ == ((XCoffSym*)VG_(indexXA)(syms,k))->first;
k++)
;
/* So now [i .. k-1] is a group all with the same start address.
Clip their ending addresses so they don't overlap [k]. In
the normal case (no overlaps), k == i+1. */
if (k < nsyms) {
- XCoffSym* next = (XCoffSym*)indexXA(syms,k);
+ XCoffSym* next = (XCoffSym*)VG_(indexXA)(syms,k);
for (m = i; m < k; m++) {
- XCoffSym* here = (XCoffSym*)indexXA(syms,m);
+ XCoffSym* here = (XCoffSym*)VG_(indexXA)(syms,m);
vg_assert(here->first < next->first);
if (here->last >= next->first)
here->last = next->first-1;
@@ -780,9 +781,9 @@
j = 1;
for (i = 1; i < nsyms; i++) {
vg_assert(j <= i);
- XCoffSym* s_j1 = (XCoffSym*)indexXA(syms, j-1);
- XCoffSym* s_j = (XCoffSym*)indexXA(syms, j);
- XCoffSym* s_i = (XCoffSym*)indexXA(syms, i);
+ XCoffSym* s_j1 = (XCoffSym*)VG_(indexXA)(syms, j-1);
+ XCoffSym* s_j = (XCoffSym*)VG_(indexXA)(syms, j);
+ XCoffSym* s_i = (XCoffSym*)VG_(indexXA)(syms, i);
if (s_i->first != s_j1->first
|| s_i->last != s_j1->last
|| 0 != cmp_Names(s_i->name, s_j1->name)) {
@@ -798,12 +799,12 @@
}
}
vg_assert(j >= 0 && j <= nsyms);
- dropTailXA(syms, nsyms - j);
+ VG_(dropTailXA)(syms, nsyms - j);
nsyms = j;
if (1) {
for (i = 0; i < nsyms; i++) {
- XCoffSym* s = (XCoffSym*)indexXA(syms, i);
+ XCoffSym* s = (XCoffSym*)VG_(indexXA)(syms, i);
if (SHOW && SHOW_SYMS_P2) {
VG_(printf)("Phase2: %d 0x%lx 0x%lx ",
i, s->first, s->last);
@@ -827,8 +828,8 @@
/* The lookupXAs in the C_FUN(.bf) part have to operate by
inclusion. Hence: */
- setCmpFnXA(syms, cmp_XCoffSym_by_overlap);
- sortXA(syms);
+ VG_(setCmpFnXA)(syms, cmp_XCoffSym_by_overlap);
+ VG_(sortXA)(syms);
/* In this loop, p3currsym is maintained as a pointer to the most
recent XCoffSym identified as FCN(.bf) (function start).
@@ -1001,12 +1002,12 @@
Word ix_lo, ix_hi;
/* Search for all symbols intersecting fn_start_avma. */
- Bool found = lookupXA(syms, &key, &ix_lo, &ix_hi);
+ Bool found = VG_(lookupXA)(syms, &key, &ix_lo, &ix_hi);
if (found) {
/* All the 'syms' entries from ix_lo to ix_hi match. */
for (k = ix_lo; k <= ix_hi; k++) {
- XCoffSym* tsym = (XCoffSym*)indexXA(syms,k);
+ XCoffSym* tsym = (XCoffSym*)VG_(indexXA)(syms,k);
/* note the start line number */
if (tsym->slnno == 0 && fn_start_lnno > 0)
@@ -1095,8 +1096,8 @@
/* Re-sort 'syms' using the compare-start-addresses ordering, so we
can use that in subsequent searches. */
- setCmpFnXA(syms, cmp_XCoffSym_by_start);
- sortXA(syms);
+ VG_(setCmpFnXA)(syms, cmp_XCoffSym_by_start);
+ VG_(sortXA)(syms);
if (oi_lnos && oi_nent_lnos > 0) {
@@ -1146,11 +1147,11 @@
key.first = sym_avma;
Word ix_lo, ix_hi;
- Bool found = lookupXA(syms, &key, &ix_lo, &ix_hi);
+ Bool found = VG_(lookupXA)(syms, &key, &ix_lo, &ix_hi);
if (found) {
/* All the 'syms' entries from ix_lo to ix_hi match.
Just use the lowest (sigh ..) */
- p4currsym = (XCoffSym*)indexXA(syms, ix_lo);
+ p4currsym = (XCoffSym*)VG_(indexXA)(syms, ix_lo);
} else {
/* We can't find the relevant sym, but we still have to
wade through the line number info for this function
@@ -1321,7 +1322,7 @@
VG_(memset)(&key, 0, sizeof(key));
key.first = fndescr_0;
Word ix_lo, ix_hi;
- Bool found = lookupXA(syms, &key, &ix_lo, &ix_hi);
+ Bool found = VG_(lookupXA)(syms, &key, &ix_lo, &ix_hi);
if (found) {
/* So all the 'syms' entries from ix_lo to ix_hi have an
address which matches the entry point address stated in
@@ -1332,7 +1333,7 @@
descriptor matches the text symbol we already have, and
so we have a valid tocptr value from fndescr[1]. */
for (k = ix_lo; k <= ix_hi; k++) {
- XCoffSym* tsym = (XCoffSym*)indexXA(syms,k);
+ XCoffSym* tsym = (XCoffSym*)VG_(indexXA)(syms,k);
vg_assert(!is_empty_Name(tsym->name));
/* VG_(printf)("cmp %s %s\n", name, tsym->name); */
/* VG_(printf)("found matching %d %s\n", k, tsym->name); */
@@ -1417,10 +1418,10 @@
if (SHOW && SHOW_SYMS_P5) {
VG_(memset)(&key, 0, sizeof(key));
key.first = wP[0];
- found = lookupXA(syms, &key, &ix_lo, &ix_hi);
+ found = VG_(lookupXA)(syms, &key, &ix_lo, &ix_hi);
if (found) {
vg_assert(ix_lo <= ix_hi);
- XCoffSym* tsym = (XCoffSym*)indexXA(syms,ix_lo);
+ XCoffSym* tsym = (XCoffSym*)VG_(indexXA)(syms,ix_lo);
VG_(printf)("Phase5: bad tocptc at 0x%016llx={",
(ULong)(UWord)(wP-1));
print_Name(tsym->name);
@@ -1435,10 +1436,10 @@
have anything for wP[0]. */
VG_(memset)(&key, 0, sizeof(key));
key.first = wP[0];
- found = lookupXA(syms, &key, &ix_lo, &ix_hi);
+ found = VG_(lookupXA)(syms, &key, &ix_lo, &ix_hi);
if (found) {
for (k = ix_lo; k <= ix_hi; k++) {
- XCoffSym* tsym = (XCoffSym*)indexXA(syms,k);
+ XCoffSym* tsym = (XCoffSym*)VG_(indexXA)(syms,k);
Addr r2val = wP[1];
if (tsym->r2known) {
if (tsym->r2value != r2val)
@@ -1474,7 +1475,7 @@
for (i = 0; i < nsyms; i++) {
DiSym di;
- XCoffSym* s = (XCoffSym*)indexXA(syms, i);
+ XCoffSym* s = (XCoffSym*)VG_(indexXA)(syms, i);
Addr addr = s->first;
UWord size = s->last + 1 - s->first;
Bool guessed_toc = False;
@@ -1535,7 +1536,7 @@
}
/* Free up the XA */
- deleteXA(syms);
+ VG_(deleteXA)(syms);
# undef SYM_IX
Modified: trunk/coregrind/m_initimg/initimg-aix5.c
===================================================================
--- trunk/coregrind/m_initimg/initimg-aix5.c 2007-02-27 22:31:45 UTC (rev 6624)
+++ trunk/coregrind/m_initimg/initimg-aix5.c 2007-02-27 22:36:14 UTC (rev 6625)
@@ -38,6 +38,7 @@
#include "pub_core_libcfile.h"
#include "pub_core_libcproc.h"
#include "pub_core_libcprint.h"
+#include "pub_core_xarray.h"
#include "pub_core_clientstate.h"
#include "pub_core_aspacemgr.h"
#include "pub_core_mallocfree.h"
@@ -374,15 +375,19 @@
# if defined(VGP_ppc32_aix5)
- vg_assert(arch->vex.guest_GPR3 >= 1 + VG_(args_for_valgrind).used);
- arch->vex.guest_GPR3 -= (1 + VG_(args_for_valgrind).used);
- arch->vex.guest_GPR4 += sizeof(UWord) * (1 + VG_(args_for_valgrind).used);
+ { UWord n_vargs = VG_(sizeXA)( VG_(args_for_valgrind) );
+ vg_assert(arch->vex.guest_GPR3 >= 1 + n_vargs);
+ arch->vex.guest_GPR3 -= (1 + n_vargs);
+ arch->vex.guest_GPR4 += sizeof(UWord) * (1 + n_vargs);
+ }
# else /* defined(VGP_ppc64_aix5) */
- vg_assert(arch->vex.guest_GPR14 >= 1 + VG_(args_for_valgrind).used);
- arch->vex.guest_GPR14 -= (1 + VG_(args_for_valgrind).used);
- arch->vex.guest_GPR15 += sizeof(UWord) * (1 + VG_(args_for_valgrind).used);
+ { UWord n_vargs = VG_(sizeXA)( VG_(args_for_valgrind) );
+ vg_assert(arch->vex.guest_GPR14 >= 1 + n_vargs);
+ arch->vex.guest_GPR14 -= (1 + n_vargs);
+ arch->vex.guest_GPR15 += sizeof(UWord) * (1 + n_vargs);
+ }
# endif
Modified: trunk/coregrind/m_syswrap/syswrap-aix5.c
===================================================================
--- trunk/coregrind/m_syswrap/syswrap-aix5.c 2007-02-27 22:31:45 UTC (rev 6624)
+++ trunk/coregrind/m_syswrap/syswrap-aix5.c 2007-02-27 22:36:14 UTC (rev 6625)
@@ -35,6 +35,7 @@
#include "pub_core_aspacemgr.h"
#include "pub_core_debuginfo.h" // VG_(di_notify_*)
#include "pub_core_transtab.h" // VG_(discard_translations)
+#include "pub_core_xarray.h"
#include "pub_core_clientstate.h"
#include "pub_core_debuglog.h"
#include "pub_core_libcbase.h"
@@ -941,12 +942,12 @@
} else {
vg_assert( VG_(args_for_valgrind_noexecpass) >= 0 );
vg_assert( VG_(args_for_valgrind_noexecpass)
- <= VG_(args_for_valgrind).used );
+ <= VG_(sizeXA)( VG_(args_for_valgrind) ) );
/* how many args in total will there be? */
// launcher basename
tot_args = 1;
// V's args
- tot_args += VG_(args_for_valgrind).used;
+ tot_args += VG_(sizeXA)( VG_(args_for_valgrind) );
tot_args -= VG_(args_for_valgrind_noexecpass);
// name of client exe
tot_args++;
@@ -962,10 +963,10 @@
// copy
j = 0;
argv[j++] = launcher_basename;
- for (i = 0; i < VG_(args_for_valgrind).used; i++) {
+ for (i = 0; i < VG_(sizeXA)( VG_(args_for_valgrind) ); i++) {
if (i < VG_(args_for_valgrind_noexecpass))
continue;
- argv[j++] = VG_(args_for_valgrind).strs[i];
+ argv[j++] = * (HChar**) VG_(indexXA)( VG_(args_for_valgrind), i );
}
argv[j++] = (Char*)ARG1;
if (arg2copy && arg2copy[0])
Modified: trunk/memcheck/mc_replace_strmem.c
===================================================================
--- trunk/memcheck/mc_replace_strmem.c 2007-02-27 22:31:45 UTC (rev 6624)
+++ trunk/memcheck/mc_replace_strmem.c 2007-02-27 22:36:14 UTC (rev 6625)
@@ -538,6 +538,8 @@
"*** memmove_chk: buffer overflow detected ***: " \
"program terminated"); \
_exit(127); \
+ /*NOTREACHED*/ \
+ return NULL; \
}
GLIBC25___MEMMOVE_CHK(m_libc_soname, __memmove_chk)
|
|
From: <sv...@va...> - 2007-02-27 22:31:48
|
Author: njn
Date: 2007-02-27 22:31:45 +0000 (Tue, 27 Feb 2007)
New Revision: 6624
Log:
update
Modified:
trunk/docs/xml/manual-core.xml
Modified: trunk/docs/xml/manual-core.xml
===================================================================
--- trunk/docs/xml/manual-core.xml 2007-02-27 18:38:33 UTC (rev 6623)
+++ trunk/docs/xml/manual-core.xml 2007-02-27 22:31:45 UTC (rev 6624)
@@ -443,8 +443,8 @@
<listitem>
<para>Remaining lines: This is the calling context for the error --
- the chain of function calls that led to it. There can be up to four
- of these lines.</para>
+ the chain of function calls that led to it. There can be up to
+ twenty-four of these lines.</para>
<para>Locations may be either names of shared objects/executables or
wildcards matching function names. They begin
|
|
From: Nicholas N. <nj...@cs...> - 2007-02-27 22:25:23
|
On Tue, 27 Feb 2007, Bart Van Assche wrote: > A new drd version is available at the following location: > http://home.euphonynet.be/bvassche/valgrind/valgrind-6618-drd-2007-02-27.patch.gz Good work :) > - Started optimizing the bitmap implementation in drd -- drd now works > several times faster for clients with 10 threads or more. More work > has to be done in this area however. (Only bm_clear() and > bm_has_access() have been optimized. According to cachegrind, > VG_(OSet_Next)() is now the function that consumes most CPU cycles.) Cachegrind doesn't tell you cycles, only instructions and cache misses. Often they correlate to cycles pretty well but not always. If OSet is too slow, you could try using VgHashTable (see pub_tool_hashtable.h). It has a similar interface and so you might be able to switch over easily. It's faster in some cases, especially for iteration. Or, you could try to reduce the number of times you iterate over the data structure :) Nick |
|
From: <sv...@va...> - 2007-02-27 18:38:53
|
Author: sewardj
Date: 2007-02-27 18:38:33 +0000 (Tue, 27 Feb 2007)
New Revision: 6623
Log:
Barf more elegantly.
Modified:
trunk/coregrind/m_debuginfo/readdwarf.c
Modified: trunk/coregrind/m_debuginfo/readdwarf.c
===================================================================
--- trunk/coregrind/m_debuginfo/readdwarf.c 2007-02-27 18:37:21 UTC (rev 6622)
+++ trunk/coregrind/m_debuginfo/readdwarf.c 2007-02-27 18:38:33 UTC (rev 6623)
@@ -2680,9 +2680,8 @@
break;
default:
- if (ddump_frames /* || trace_cfi*/)
- VG_(printf)("XXX unhandled dwarf expr opcode 0x%x\n",
- (Int)opcode );
+ VG_(message)(Vg_DebugMsg, "DWARF2 CFI reader: unhandled DW_OP_ "
+ "opcode 0x%x", (Int)opcode);
return -1;
}
|
|
From: <sv...@va...> - 2007-02-27 18:37:27
|
Author: sewardj
Date: 2007-02-27 18:37:21 +0000 (Tue, 27 Feb 2007)
New Revision: 6622
Log:
Add .eh_frame gunk for VG_(amd64_linux_REDIR_FOR_vgettimeofday) and
VG_(amd64_linux_REDIR_FOR_vgettimeofday) so they can participate in
stack unwinding.
Modified:
trunk/coregrind/m_trampoline.S
Modified: trunk/coregrind/m_trampoline.S
===================================================================
--- trunk/coregrind/m_trampoline.S 2007-02-27 17:43:43 UTC (rev 6621)
+++ trunk/coregrind/m_trampoline.S 2007-02-27 18:37:21 UTC (rev 6622)
@@ -157,17 +157,65 @@
ud2
.global VG_(amd64_linux_REDIR_FOR_vgettimeofday)
+.type VG_(amd64_linux_REDIR_FOR_vgettimeofday), @function
VG_(amd64_linux_REDIR_FOR_vgettimeofday):
+.LfnB2:
movq $__NR_gettimeofday, %rax
syscall
ret
-
+.LfnE2:
+.size VG_(amd64_linux_REDIR_FOR_vgettimeofday), .-LfnB2
+
.global VG_(amd64_linux_REDIR_FOR_vtime)
+.type VG_(amd64_linux_REDIR_FOR_vtime), @function
VG_(amd64_linux_REDIR_FOR_vtime):
+.LfnB3:
movq $__NR_time, %rax
syscall
ret
+.LfnE3:
+.size VG_(amd64_linux_REDIR_FOR_vtime), .-LfnB3
+/* A CIE for the above two functions, followed by their FDEs */
+ .section .eh_frame,"a",@progbits
+.Lframe1:
+ .long .LEcie1-.LScie1
+.LScie1:
+ .long 0x0
+ .byte 0x1
+ .string "zR"
+ .uleb128 0x1
+ .sleb128 -8
+ .byte 0x10
+ .uleb128 0x1
+ .byte 0x3
+ .byte 0xc
+ .uleb128 0x7
+ .uleb128 0x8
+ .byte 0x90
+ .uleb128 0x1
+ .align 8
+.LEcie1:
+.LSfde2:
+ .long .LEfde2-.LASfde2
+.LASfde2:
+ .long .LASfde2-.Lframe1
+ .long .LfnB2
+ .long .LfnE2-.LfnB2
+ .uleb128 0x0
+ .align 8
+.LEfde2:
+.LSfde3:
+ .long .LEfde3-.LASfde3
+.LASfde3:
+ .long .LASfde3-.Lframe1
+ .long .LfnB3
+ .long .LfnE3-.LfnB3
+ .uleb128 0x0
+ .align 8
+.LEfde3:
+ .previous
+
.global VG_(trampoline_stuff_end)
VG_(trampoline_stuff_end):
|
|
From: <sv...@va...> - 2007-02-27 17:44:03
|
Author: sewardj
Date: 2007-02-27 17:43:43 +0000 (Tue, 27 Feb 2007)
New Revision: 6621
Log:
Make the leb readers 64-bit clean. That should guard against another
couple of decades of Moore's law.
Modified:
trunk/coregrind/m_debuginfo/readdwarf.c
Modified: trunk/coregrind/m_debuginfo/readdwarf.c
===================================================================
--- trunk/coregrind/m_debuginfo/readdwarf.c 2007-02-27 16:52:23 UTC (rev 6620)
+++ trunk/coregrind/m_debuginfo/readdwarf.c 2007-02-27 17:43:43 UTC (rev 6621)
@@ -198,9 +198,9 @@
static
-UInt read_leb128 ( UChar* data, Int* length_return, Int sign )
+ULong read_leb128 ( UChar* data, Int* length_return, Int sign )
{
- UInt result = 0;
+ ULong result = 0;
UInt num_read = 0;
Int shift = 0;
UChar byte;
@@ -212,7 +212,7 @@
byte = * data ++;
num_read ++;
- result |= (byte & 0x7f) << shift;
+ result |= ((ULong)(byte & 0x7f)) << shift;
shift += 7;
@@ -222,8 +222,8 @@
if (length_return != NULL)
* length_return = num_read;
- if (sign && (shift < 32) && (byte & 0x40))
- result |= -1 << shift;
+ if (sign && (shift < 64) && (byte & 0x40))
+ result |= (-1ULL) << shift;
return result;
}
@@ -231,21 +231,21 @@
/* Small helper functions easier to use
* value is returned and the given pointer is
* moved past end of leb128 data */
-static UInt read_leb128U( UChar **data )
+static ULong read_leb128U( UChar **data )
{
Int len;
- UInt val = read_leb128( *data, &len, 0 );
+ ULong val = read_leb128( *data, &len, 0 );
*data += len;
return val;
}
/* Same for signed data */
-static Int read_leb128S( UChar **data )
+static Long read_leb128S( UChar **data )
{
Int len;
- UInt val = read_leb128( *data, &len, 1 );
+ ULong val = read_leb128( *data, &len, 1 );
*data += len;
- return val;
+ return (Long)val;
}
/* Read what the DWARF3 spec calls an "initial length field". This
@@ -254,7 +254,16 @@
Read 32-bit value from p. If it is 0xFFFFFFFF, instead read a
64-bit bit value from p+4. This is used in 64-bit dwarf to encode
- some table lengths. */
+ some table lengths.
+
+ XXX this is a hack: the endianness of the initial length field is
+ specified by the DWARF we're reading. This happens to work only
+ because we don't do cross-arch jitting, hence this code runs on a
+ platform of the same endianness as the DWARF it is reading. Same
+ applies for initial lengths for CIE/FDEs and probably in zillions
+ of other places -- to be precise, exactly the places where
+ binutils/dwarf.c calls byte_get().
+*/
static ULong read_initial_length_field ( UChar* p_img, /*OUT*/Bool* is64 )
{
UInt w32 = *((UInt*)p_img);
|
|
From: <sv...@va...> - 2007-02-27 16:52:31
|
Author: sewardj
Date: 2007-02-27 16:52:23 +0000 (Tue, 27 Feb 2007)
New Revision: 6620
Log:
Add limited support for DWARF3 'expressions' in stack-unwind (CFI)
info (DW_CFA_def_cfa_expression, DW_CFA_expression,
DW_CFA_val_expression). Mechanism to support all of these is in place
although only DW_CFA_val_expression is currently connected up.
This is really nasty. The basic idea is to partially evaluate each
expression at the debuginfo-reading time by running it on a stack
machine in which each stack element is an expression tree. If the
expression can be 'run' successfully, the tree (dag, really) remaining
at the top of the stack is massaged and put into the DiCfSI record for
that address range. At unwind time the tree is evaluated if needed.
Such cases are in fact extremely rare and so the vast majority of
unwindings use the same mechanism as before.
As a result of all this:
* some obscure cases in glibc-2.5's libpthread.so unwind when they
didn't before
* --debug-dump=frames produces identical output to that of readelf
for libc-2.5.so and associated libpthread.so
* All the action centers around the new type CfiExpr, which is a
union expression-tree type in the same style as IRExpr et al
* Many dark corners of the CFI reader have been looked at and
(re-)validated
Modified:
trunk/coregrind/m_debuginfo/debuginfo.c
trunk/coregrind/m_debuginfo/priv_storage.h
trunk/coregrind/m_debuginfo/readdwarf.c
trunk/coregrind/m_debuginfo/readelf.c
trunk/coregrind/m_debuginfo/readstabs.c
trunk/coregrind/m_debuginfo/storage.c
Modified: trunk/coregrind/m_debuginfo/debuginfo.c
===================================================================
--- trunk/coregrind/m_debuginfo/debuginfo.c 2007-02-27 16:40:53 UTC (rev 6619)
+++ trunk/coregrind/m_debuginfo/debuginfo.c 2007-02-27 16:52:23 UTC (rev 6620)
@@ -47,6 +47,7 @@
#include "pub_core_redir.h" // VG_(redir_notify_{new,delete}_SegInfo)
#include "pub_core_aspacemgr.h"
#include "pub_core_machine.h" // VG_PLAT_USES_PPCTOC
+#include "pub_core_xarray.h"
#include "priv_storage.h"
#include "priv_readdwarf.h"
#include "priv_readstabs.h"
@@ -141,7 +142,6 @@
si->ddump_frames = VG_(clo_debug_dump_frames);
}
-
return si;
}
@@ -151,10 +151,11 @@
{
struct strchunk *chunk, *next;
vg_assert(si != NULL);
- if (si->filename) VG_(arena_free)(VG_AR_SYMTAB, si->filename);
- if (si->symtab) VG_(arena_free)(VG_AR_SYMTAB, si->symtab);
- if (si->loctab) VG_(arena_free)(VG_AR_SYMTAB, si->loctab);
- if (si->cfsi) VG_(arena_free)(VG_AR_SYMTAB, si->cfsi);
+ if (si->filename) VG_(arena_free)(VG_AR_SYMTAB, si->filename);
+ if (si->symtab) VG_(arena_free)(VG_AR_SYMTAB, si->symtab);
+ if (si->loctab) VG_(arena_free)(VG_AR_SYMTAB, si->loctab);
+ if (si->cfsi) VG_(arena_free)(VG_AR_SYMTAB, si->cfsi);
+ if (si->cfsi_exprs) VG_(deleteXA)(si->cfsi_exprs);
for (chunk = si->strchunks; chunk != NULL; chunk = next) {
next = chunk->next;
@@ -971,6 +972,72 @@
# undef BUF_LEN
}
+
+/*------------------------------------------------------------*/
+/*--- For unwinding the stack using --- */
+/*--- pre-summarised DWARF3 .eh_frame info ---*/
+/*------------------------------------------------------------*/
+
+/* Gather up all the constant pieces of info needed to evaluate
+ a CfiExpr into one convenient struct. */
+typedef
+ struct {
+ Addr ipHere;
+ Addr spHere;
+ Addr fpHere;
+ Addr min_accessible;
+ Addr max_accessible;
+ }
+ CfiExprEvalContext;
+
+/* Evaluate the CfiExpr rooted at ix in exprs given the context eec.
+ *ok is set to False on failure, but not to True on success. The
+ caller must set it to True before calling. */
+static
+UWord evalCfiExpr ( XArray* exprs, Int ix,
+ CfiExprEvalContext* eec, Bool* ok )
+{
+ UWord wL, wR;
+ CfiExpr* e = VG_(indexXA)( exprs, ix );
+ switch (e->tag) {
+ case Cex_Binop:
+ wL = evalCfiExpr( exprs, e->Cex.Binop.ixL, eec, ok );
+ if (!(*ok)) return 0;
+ wR = evalCfiExpr( exprs, e->Cex.Binop.ixR, eec, ok );
+ if (!(*ok)) return 0;
+ switch (e->Cex.Binop.op) {
+ case Cop_Add: return wL + wR;
+ case Cop_Sub: return wL - wR;
+ default: goto unhandled;
+ }
+ /*NOTREACHED*/
+ case Cex_CfiReg:
+ switch (e->Cex.CfiReg.reg) {
+ case Creg_IP: return (Addr)eec->ipHere;
+ case Creg_SP: return (Addr)eec->spHere;
+ case Creg_FP: return (Addr)eec->fpHere;
+ default: goto unhandled;
+ }
+ /*NOTREACHED*/
+ case Cex_Const:
+ return e->Cex.Const.con;
+ default:
+ goto unhandled;
+ }
+ /*NOTREACHED*/
+ unhandled:
+ VG_(printf)("\n\nevalCfiExpr: unhandled\n");
+ ML_(ppCfiExpr)( exprs, ix );
+ VG_(printf)("\n");
+ vg_assert(0);
+ /*NOTREACHED*/
+ return 0;
+}
+
+
+/* The main function for DWARF2/3 CFI-based stack unwinding.
+ Given an IP/SP/FP triple, produce the IP/SP/FP values for the
+ previous frame, if possible. */
/* Returns True if OK. If not OK, *{ip,sp,fp}P are not changed. */
/* NOTE: this function may rearrange the order of entries in the
SegInfo list. */
@@ -980,11 +1047,14 @@
Addr min_accessible,
Addr max_accessible )
{
+ Bool ok;
Int i;
SegInfo* si;
DiCfSI* cfsi = NULL;
Addr cfa, ipHere, spHere, fpHere, ipPrev, spPrev, fpPrev;
+ CfiExprEvalContext eec;
+
static UInt n_search = 0;
static UInt n_steps = 0;
n_search++;
@@ -1016,7 +1086,7 @@
VG_(printf)("%u %u\n", n_search, n_steps);
/* Start of performance-enhancing hack: once every 16 (chosen
- hackily after profiling) successful searchs, move the found
+ hackily after profiling) successful searches, move the found
SegInfo one step closer to the start of the list. This makes
future searches cheaper. For starting konqueror on amd64, this
in fact reduces the total amount of searching done by the above
@@ -1048,7 +1118,7 @@
if (0) {
VG_(printf)("found cfisi: ");
- ML_(ppDiCfSI)(cfsi);
+ ML_(ppDiCfSI)(si->cfsi_exprs, cfsi);
}
ipPrev = spPrev = fpPrev = 0;
@@ -1057,8 +1127,25 @@
spHere = *spP;
fpHere = *fpP;
- cfa = cfsi->cfa_off + (cfsi->cfa_sprel ? spHere : fpHere);
+ /* First compute the CFA. */
+ cfa = 0;
+ switch (cfsi->cfa_how) {
+ case CFIC_SPREL:
+ cfa = cfsi->cfa_off + spHere;
+ break;
+ case CFIC_FPREL:
+ cfa = cfsi->cfa_off + fpHere;
+ break;
+ case CFIC_EXPR:
+ vg_assert(0);
+ break;
+ default:
+ vg_assert(0);
+ }
+ /* Now we know the CFA, use it to roll back the registers we're
+ interested in. */
+
# define COMPUTE(_prev, _here, _how, _off) \
do { \
switch (_how) { \
@@ -1077,6 +1164,20 @@
case CFIR_CFAREL: \
_prev = cfa + (Word)_off; \
break; \
+ case CFIR_EXPR: \
+ if (0) \
+ ML_(ppCfiExpr)(si->cfsi_exprs,_off); \
+ eec.ipHere = ipHere; \
+ eec.spHere = spHere; \
+ eec.fpHere = fpHere; \
+ eec.min_accessible = min_accessible; \
+ eec.max_accessible = max_accessible; \
+ ok = True; \
+ _prev = evalCfiExpr(si->cfsi_exprs, _off, &eec, &ok ); \
+ if (!ok) return False; \
+ break; \
+ default: \
+ vg_assert(0); \
} \
} while (0)
Modified: trunk/coregrind/m_debuginfo/priv_storage.h
===================================================================
--- trunk/coregrind/m_debuginfo/priv_storage.h 2007-02-27 16:40:53 UTC (rev 6619)
+++ trunk/coregrind/m_debuginfo/priv_storage.h 2007-02-27 16:52:23 UTC (rev 6620)
@@ -37,6 +37,8 @@
/* See comment at top of debuginfo.c for explanation of
the _svma / _avma / _image / _bias naming scheme.
*/
+/* Note this is not freestanding; needs pub_core_xarray.h to be
+ included before it. */
#ifndef __PRIV_STORAGE_H
#define __PRIV_STORAGE_H
@@ -97,7 +99,10 @@
First off, calculate CFA, the Canonical Frame Address, thusly:
- cfa = if cfa_sprel then sp+cfa_off else fp+cfa_off
+ cfa = case cfa_how of
+ CFIC_SPREL -> sp + cfa_off
+ CFIC_FPREL -> fp + cfa_off
+ CFIR_EXPR -> expr whose index is in cfa_off
Once that is done, the previous frame's sp/fp values and this
frame's ra value can be calculated like this:
@@ -108,21 +113,27 @@
CFIR_SAME -> same as it was before (sp/fp only)
CFIR_CFAREL -> cfa + sp/fp/ra_off
CFIR_MEMCFAREL -> *( cfa + sp/fp/ra_off )
+ CFIR_EXPR -> expr whose index is in sp/fp/ra_off
*/
-#define CFIR_UNKNOWN ((UChar)0)
-#define CFIR_SAME ((UChar)1)
-#define CFIR_CFAREL ((UChar)2)
-#define CFIR_MEMCFAREL ((UChar)3)
+#define CFIC_SPREL ((UChar)1)
+#define CFIC_FPREL ((UChar)2)
+#define CFIC_EXPR ((UChar)3)
+#define CFIR_UNKNOWN ((UChar)4)
+#define CFIR_SAME ((UChar)5)
+#define CFIR_CFAREL ((UChar)6)
+#define CFIR_MEMCFAREL ((UChar)7)
+#define CFIR_EXPR ((UChar)8)
+
typedef
struct {
Addr base;
UInt len;
- Bool cfa_sprel;
- UChar ra_how; /* a CFIR_ value */
- UChar sp_how; /* a CFIR_ value */
- UChar fp_how; /* a CFIR_ value */
+ UChar cfa_how; /* a CFIC_ value */
+ UChar ra_how; /* a CFIR_ value */
+ UChar sp_how; /* a CFIR_ value */
+ UChar fp_how; /* a CFIR_ value */
Int cfa_off;
Int ra_off;
Int sp_off;
@@ -130,6 +141,71 @@
}
DiCfSI;
+
+typedef
+ enum {
+ Cop_Add=0x321,
+ Cop_Sub,
+ Cop_And
+ }
+ CfiOp;
+
+typedef
+ enum {
+ Creg_SP=0x213,
+ Creg_FP,
+ Creg_IP
+ }
+ CfiReg;
+
+typedef
+ enum {
+ Cex_Undef=0x123,
+ Cex_Deref,
+ Cex_Const,
+ Cex_Binop,
+ Cex_CfiReg,
+ Cex_DwReg
+ }
+ CfiExprTag;
+
+typedef
+ struct {
+ CfiExprTag tag;
+ union {
+ struct {
+ } Undef;
+ struct {
+ Int ixAddr;
+ } Deref;
+ struct {
+ UWord con;
+ } Const;
+ struct {
+ CfiOp op;
+ Int ixL;
+ Int ixR;
+ } Binop;
+ struct {
+ CfiReg reg;
+ } CfiReg;
+ struct {
+ Int reg;
+ } DwReg;
+ }
+ Cex;
+ }
+ CfiExpr;
+
+extern Int ML_(CfiExpr_Undef) ( XArray* dst );
+extern Int ML_(CfiExpr_Deref) ( XArray* dst, Int ixAddr );
+extern Int ML_(CfiExpr_Const) ( XArray* dst, UWord con );
+extern Int ML_(CfiExpr_Binop) ( XArray* dst, CfiOp op, Int ixL, Int ixR );
+extern Int ML_(CfiExpr_CfiReg)( XArray* dst, CfiReg reg );
+extern Int ML_(CfiExpr_DwReg) ( XArray* dst, Int reg );
+
+extern void ML_(ppCfiExpr)( XArray* src, Int ix );
+
/* --------------------- SEGINFO --------------------- */
/* This is the top-level data type. It's a structure which contains
@@ -159,12 +235,15 @@
UInt loctab_size;
/* An expandable array of CFI summary info records. Also includes
summary address bounds, showing the min and max address covered
- by any of the records, as an aid to fast searching. */
+ by any of the records, as an aid to fast searching. And, if the
+ records require any expression nodes, they are stored in
+ cfsi_exprs. */
DiCfSI* cfsi;
UInt cfsi_used;
UInt cfsi_size;
Addr cfsi_minaddr;
Addr cfsi_maxaddr;
+ XArray* cfsi_exprs; /* XArray of CfSiExpr */
/* Expandable arrays of characters -- the string table. Pointers
into this are stable (the arrays are not reallocated). */
@@ -256,7 +335,7 @@
extern void ML_(ppSym) ( Int idx, DiSym* sym );
/* Print a call-frame-info summary. */
-extern void ML_(ppDiCfSI) ( DiCfSI* si );
+extern void ML_(ppDiCfSI) ( XArray* /* of CfiExpr */ exprs, DiCfSI* si );
#define TRACE_SYMTAB(format, args...) \
Modified: trunk/coregrind/m_debuginfo/readdwarf.c
===================================================================
--- trunk/coregrind/m_debuginfo/readdwarf.c 2007-02-27 16:40:53 UTC (rev 6619)
+++ trunk/coregrind/m_debuginfo/readdwarf.c 2007-02-27 16:52:23 UTC (rev 6620)
@@ -39,6 +39,7 @@
#include "pub_core_libcprint.h"
#include "pub_core_mallocfree.h"
#include "pub_core_options.h"
+#include "pub_core_xarray.h"
#include "priv_storage.h"
#include "priv_readdwarf.h" /* self */
@@ -204,6 +205,8 @@
Int shift = 0;
UChar byte;
+ vg_assert(sign == 0 || sign == 1);
+
do
{
byte = * data ++;
@@ -225,7 +228,6 @@
return result;
}
-
/* Small helper functions easier to use
* value is returned and the given pointer is
* moved past end of leb128 data */
@@ -1807,35 +1809,65 @@
The result is then summarised into a sequence of CfiSIs, if
possible. UnwindContext effectively holds the state of the
abstract machine whilst it is running.
+
+ The CFA can either be a signed offset from a register,
+ or an expression:
+
+ CFA = cfa_reg + cfa_off when UnwindContext.cfa_is_regoff==True
+ | [[ cfa_expr_id ]]
+
+ When .cfa_is_regoff == True, cfa_expr_id must be zero
+ When .cfa_is_regoff == False, cfa_reg must be zero
+ and cfa_off must be zero
+
+ RegRule describes, for each register, how to get its
+ value in the previous frame, where 'cfa' denotes the cfa
+ for the frame as a whole:
+
+ RegRule = RR_Undef -- undefined
+ | RR_Same -- same as in previous frame
+ | RR_CFAOff arg -- is at * ( cfa + arg )
+ | RR_CFAValOff arg -- is ( cfa + arg )
+ | RR_Reg arg -- is in register 'arg'
+ | RR_Expr arg -- is at * [[ arg ]]
+ | RR_ValExpr arg -- is [[ arg ]]
+ | RR_Arch -- dunno
+
+ All expressions are stored in exprs in the containing
+ UnwindContext. Since the UnwindContext gets reinitialised for each
+ new FDE, summarise_context needs to copy out any expressions it
+ wants to keep into the cfsi_exprs field of the containing SegInfo.
*/
typedef
struct {
- enum { RR_Undef, RR_Same, RR_CFAoff, RR_Reg, RR_Arch, RR_Expr,
- RR_CFAValoff, RR_ValExpr } tag;
-
- /* Note, .coff and .reg are never both in use. Therefore could
- merge them into one. */
-
- /* CFA offset if tag==RR_CFAoff */
- Int coff;
-
- /* reg, if tag==RR_Reg */
- Int reg;
+ enum { RR_Undef, RR_Same, RR_CFAOff, RR_CFAValOff,
+ RR_Reg, RR_Expr, RR_ValExpr, RR_Arch } tag;
+ /* meaning: int offset for CFAoff/CFAValOff
+ reg # for Reg
+ expr index for Expr/ValExpr */
+ Int arg;
}
RegRule;
-static void ppRegRule ( RegRule* reg )
+static void ppRegRule ( XArray* exprs, RegRule* rrule )
{
- switch (reg->tag) {
- case RR_Undef: VG_(printf)("u "); break;
- case RR_Same: VG_(printf)("s "); break;
- case RR_CFAoff: VG_(printf)("c%d ", reg->coff); break;
- case RR_CFAValoff: VG_(printf)("v%d ", reg->coff); break;
- case RR_Reg: VG_(printf)("r%d ", reg->reg); break;
- case RR_Arch: VG_(printf)("a "); break;
- case RR_Expr: VG_(printf)("e "); break;
- case RR_ValExpr: VG_(printf)("ve "); break;
- default: VG_(core_panic)("ppRegRule");
+ vg_assert(exprs);
+ switch (rrule->tag) {
+ case RR_Undef: VG_(printf)("u "); break;
+ case RR_Same: VG_(printf)("s "); break;
+ case RR_CFAOff: VG_(printf)("c%d ", rrule->arg); break;
+ case RR_CFAValOff: VG_(printf)("v%d ", rrule->arg); break;
+ case RR_Reg: VG_(printf)("r%d ", rrule->arg); break;
+ case RR_Expr: VG_(printf)("e{");
+ ML_(ppCfiExpr)( exprs, rrule->arg );
+ VG_(printf)("} ");
+ break;
+ case RR_ValExpr: VG_(printf)("ve{");
+ ML_(ppCfiExpr)( exprs, rrule->arg );
+ VG_(printf)("} ");
+ break;
+ case RR_Arch: VG_(printf)("a "); break;
+ default: VG_(core_panic)("ppRegRule");
}
}
@@ -1843,19 +1875,23 @@
typedef
struct {
/* Read-only fields (set by the CIE) */
- Int code_a_f;
- Int data_a_f;
- Addr initloc;
- Int ra_reg;
+ Int code_a_f;
+ Int data_a_f;
+ Addr initloc;
+ Int ra_reg;
/* The rest of these fields can be modifed by
run_CF_instruction. */
/* The LOC entry */
- Addr loc;
- /* The CFA entry. If -1, means we don't know (Dwarf3 Expression). */
- Int cfa_reg;
- Int cfa_offset; /* in bytes */
+ Addr loc;
+ /* The CFA entry. This can be either reg+/-offset or an expr. */
+ Bool cfa_is_regoff; /* True=>is reg+offset; False=>is expr */
+ Int cfa_reg;
+ Int cfa_off; /* in bytes */
+ Int cfa_expr_ix; /* index into cfa_exprs */
/* register unwind rules */
RegRule reg[N_CFI_REGS];
+ /* array of CfiExpr, shared by reg[] and cfa_expr_ix */
+ XArray* exprs;
}
UnwindContext;
@@ -1863,26 +1899,42 @@
{
Int i;
VG_(printf)("0x%llx: ", (ULong)ctx->loc);
- VG_(printf)("%d(r%d) ", ctx->cfa_offset, ctx->cfa_reg);
+ if (ctx->cfa_is_regoff) {
+ VG_(printf)("%d(r%d) ", ctx->cfa_off, ctx->cfa_reg);
+ } else {
+ vg_assert(ctx->exprs);
+ VG_(printf)("{");
+ ML_(ppCfiExpr)( ctx->exprs, ctx->cfa_expr_ix );
+ VG_(printf)("} ");
+ }
for (i = 0; i < N_CFI_REGS; i++)
- ppRegRule(&ctx->reg[i]);
+ ppRegRule(ctx->exprs, &ctx->reg[i]);
VG_(printf)("\n");
}
+static void* symtab_alloc ( SizeT szB ) {
+ return VG_(arena_malloc)( VG_AR_SYMTAB, szB );
+}
+static void symtab_free ( void* v ) {
+ VG_(arena_free)( VG_AR_SYMTAB, v );
+}
+
static void initUnwindContext ( /*OUT*/UnwindContext* ctx )
{
Int i;
- ctx->code_a_f = 0;
- ctx->data_a_f = 0;
- ctx->initloc = 0;
- ctx->ra_reg = RA_REG_DEFAULT;
- ctx->loc = 0;
- ctx->cfa_reg = 0;
- ctx->cfa_offset = 0;
+ ctx->code_a_f = 0;
+ ctx->data_a_f = 0;
+ ctx->initloc = 0;
+ ctx->ra_reg = RA_REG_DEFAULT;
+ ctx->loc = 0;
+ ctx->cfa_is_regoff = True;
+ ctx->cfa_reg = 0;
+ ctx->cfa_off = 0;
+ ctx->cfa_expr_ix = 0;
+ ctx->exprs = NULL;
for (i = 0; i < N_CFI_REGS; i++) {
ctx->reg[i].tag = RR_Undef;
- ctx->reg[i].coff = 0;
- ctx->reg[i].reg = 0;
+ ctx->reg[i].arg = 0;
}
}
@@ -1903,21 +1955,27 @@
static void initCfiSI ( DiCfSI* si )
{
- si->base = 0;
- si->len = 0;
- si->cfa_sprel = False;
- si->ra_how = 0;
- si->sp_how = 0;
- si->fp_how = 0;
- si->cfa_off = 0;
- si->ra_off = 0;
- si->sp_off = 0;
- si->fp_off = 0;
+ si->base = 0;
+ si->len = 0;
+ si->cfa_how = 0;
+ si->ra_how = 0;
+ si->sp_how = 0;
+ si->fp_how = 0;
+ si->cfa_off = 0;
+ si->ra_off = 0;
+ si->sp_off = 0;
+ si->fp_off = 0;
}
/* --------------- Summarisation --------------- */
+/* Forward */
+static
+Int copy_convert_CfiExpr_tree ( XArray* dst,
+ UnwindContext* srcuc,
+ Int nd );
+
/* Summarise ctx into si, if possible. Returns True if successful.
This is taken to be just after ctx's loc advances; hence the
summary is up to but not including the current loc. This works
@@ -1932,31 +1990,57 @@
initCfiSI(si);
/* How to generate the CFA */
- if (ctx->cfa_reg == -1) {
+ if (!ctx->cfa_is_regoff) {
/* it was set by DW_CFA_def_cfa_expression; we don't know what
it really is */
why = 6;
goto failed;
} else
- if (ctx->cfa_reg == SP_REG) {
- si->cfa_sprel = True;
- si->cfa_off = ctx->cfa_offset;
+ if (ctx->cfa_is_regoff && ctx->cfa_reg == SP_REG) {
+ si->cfa_how = CFIC_SPREL;
+ si->cfa_off = ctx->cfa_off;
} else
- if (ctx->cfa_reg == FP_REG) {
- si->cfa_sprel = False;
- si->cfa_off = ctx->cfa_offset;
+ if (ctx->cfa_is_regoff && ctx->cfa_reg == FP_REG) {
+ si->cfa_how = CFIC_FPREL;
+ si->cfa_off = ctx->cfa_off;
} else {
why = 1;
goto failed;
}
-# define SUMMARISE_HOW(_how, _off, _ctxreg) \
- switch (_ctxreg.tag) { \
- case RR_Undef: _how = CFIR_UNKNOWN; _off = 0; break; \
- case RR_Same: _how = CFIR_SAME; _off = 0; break; \
- case RR_CFAoff: _how = CFIR_MEMCFAREL; _off = _ctxreg.coff; break; \
- case RR_CFAValoff: _how = CFIR_CFAREL; _off = _ctxreg.coff; break; \
- default: { why = 2; goto failed; } /* otherwise give up */ \
+# define SUMMARISE_HOW(_how, _off, _ctxreg) \
+ switch (_ctxreg.tag) { \
+ case RR_Undef: \
+ _how = CFIR_UNKNOWN; _off = 0; break; \
+ case RR_Same: \
+ _how = CFIR_SAME; _off = 0; break; \
+ case RR_CFAOff: \
+ _how = CFIR_MEMCFAREL; _off = _ctxreg.arg; break; \
+ case RR_CFAValOff: \
+ _how = CFIR_CFAREL; _off = _ctxreg.arg; break; \
+ case RR_ValExpr: { \
+ XArray *src, *dst; \
+ Int conv; \
+ src = ctx->exprs; \
+ dst = seginfo->cfsi_exprs; \
+ if (src && (VG_(sizeXA)(src) > 0) && (!dst)) { \
+ dst = VG_(newXA)( symtab_alloc, symtab_free, \
+ sizeof(CfiExpr) ); \
+ vg_assert(dst); \
+ seginfo->cfsi_exprs = dst; \
+ } \
+ conv = copy_convert_CfiExpr_tree \
+ ( dst, ctx, _ctxreg.arg ); \
+ vg_assert(conv >= -1); \
+ if (conv == -1) { why = 7; goto failed; } \
+ _how = CFIR_EXPR; \
+ _off = conv; \
+ if (0 && seginfo->ddump_frames) \
+ ML_(ppCfiExpr)(dst, conv); \
+ break; \
+ } \
+ default: \
+ why = 2; goto failed; /* otherwise give up */ \
}
SUMMARISE_HOW(si->ra_how, si->ra_off, ctx->reg[ctx->ra_reg] );
@@ -2000,24 +2084,77 @@
return False;
}
+/* Copy the tree rooted at srcuc->exprs node srcix to dstxa, on the
+ way converting any DwReg regs (regs numbered using the Dwarf scheme
+ defined by each architecture's ABI) into CfiRegs, which are
+ platform independent. If the conversion isn't possible because
+ there is no equivalent register, return -1. This has the
+ undesirable side effect of de-dagifying the input; oh well. */
+static Int copy_convert_CfiExpr_tree ( XArray* dstxa,
+ UnwindContext* srcuc,
+ Int srcix )
+{
+ CfiExpr* src;
+ Int cpL, cpR, dwreg;
+ XArray* srcxa = srcuc->exprs;
+ vg_assert(srcxa);
+ vg_assert(dstxa);
+ vg_assert(srcix >= 0 && srcix < VG_(sizeXA)(srcxa));
+
+ src = VG_(indexXA)( srcxa, srcix );
+ switch (src->tag) {
+ case Cex_Undef:
+ return ML_(CfiExpr_Undef)( dstxa );
+ case Cex_Deref:
+ return ML_(CfiExpr_Deref)( dstxa, src->Cex.Deref.ixAddr );
+ case Cex_Const:
+ return ML_(CfiExpr_Const)( dstxa, src->Cex.Const.con );
+ case Cex_Binop:
+ cpL = copy_convert_CfiExpr_tree( dstxa, srcuc, src->Cex.Binop.ixL );
+ cpR = copy_convert_CfiExpr_tree( dstxa, srcuc, src->Cex.Binop.ixR );
+ vg_assert(cpL >= -1 && cpR >= -1);
+ if (cpL == -1 || cpR == -1)
+ return -1; /* propagate failure */
+ return ML_(CfiExpr_Binop)( dstxa, src->Cex.Binop.op, cpL, cpR );
+ case Cex_CfiReg:
+ /* should not see these in input (are created only by this
+ conversion step!) */
+ VG_(core_panic)("copy_convert_CfiExpr_tree: CfiReg in input");
+ case Cex_DwReg:
+ /* This is the only place where the conversion can fail. */
+ dwreg = src->Cex.DwReg.reg;
+ if (dwreg == SP_REG)
+ return ML_(CfiExpr_CfiReg)( dstxa, Creg_SP );
+ if (dwreg == FP_REG)
+ return ML_(CfiExpr_CfiReg)( dstxa, Creg_FP );
+ if (dwreg == srcuc->ra_reg)
+ return ML_(CfiExpr_CfiReg)( dstxa, Creg_IP ); /* correct? */
+ /* else we must fail - can't represent the reg */
+ return -1;
+ default:
+ VG_(core_panic)("copy_convert_CfiExpr_tree: default");
+ }
+}
+
+
static void ppUnwindContext_summary ( UnwindContext* ctx )
{
VG_(printf)("0x%llx-1: ", (ULong)ctx->loc);
if (ctx->cfa_reg == SP_REG) {
- VG_(printf)("SP/CFA=%d+SP ", ctx->cfa_offset);
+ VG_(printf)("SP/CFA=%d+SP ", ctx->cfa_off);
} else
if (ctx->cfa_reg == FP_REG) {
- VG_(printf)("SP/CFA=%d+FP ", ctx->cfa_offset);
+ VG_(printf)("SP/CFA=%d+FP ", ctx->cfa_off);
} else {
- VG_(printf)("SP/CFA=unknown ", ctx->cfa_offset);
+ VG_(printf)("SP/CFA=unknown ", ctx->cfa_off);
}
VG_(printf)("RA=");
- ppRegRule( &ctx->reg[ctx->ra_reg] );
+ ppRegRule( ctx->exprs, &ctx->reg[ctx->ra_reg] );
VG_(printf)("FP=");
- ppRegRule( &ctx->reg[FP_REG] );
+ ppRegRule( ctx->exprs, &ctx->reg[FP_REG] );
VG_(printf)("\n");
}
@@ -2106,7 +2243,7 @@
return data[0];
}
-static ULong read_le_encoded_literal ( UChar* data, UInt size )
+static ULong read_le_u_encoded_literal ( UChar* data, UInt size )
{
switch (size) {
case 8: return (ULong)read_ULong( data );
@@ -2117,6 +2254,18 @@
}
}
+static Long read_le_s_encoded_literal ( UChar* data, UInt size )
+{
+ Long s64 = read_le_u_encoded_literal( data, size );
+ switch (size) {
+ case 8: break;
+ case 4: s64 <<= 32; s64 >>= 32; break;
+ case 2: s64 <<= 48; s64 >>= 48; break;
+ case 1: s64 <<= 56; s64 >>= 56; break;
+ default: vg_assert(0); /*NOTREACHED*/ return 0;
+ }
+ return s64;
+}
static UChar default_Addr_encoding ( void )
{
@@ -2232,6 +2381,321 @@
}
+/* ------------ Run/show DWARF3 expressions ---------- */
+
+/* Taken from binutils-2.17/include/elf/dwarf2.h */
+enum dwarf_location_atom
+ {
+ DW_OP_addr = 0x03,
+ DW_OP_deref = 0x06,
+ DW_OP_const1u = 0x08,
+ DW_OP_const1s = 0x09,
+ DW_OP_const2u = 0x0a,
+ DW_OP_const2s = 0x0b,
+ DW_OP_const4u = 0x0c,
+ DW_OP_const4s = 0x0d,
+ DW_OP_const8u = 0x0e,
+ DW_OP_const8s = 0x0f,
+ DW_OP_constu = 0x10,
+ DW_OP_consts = 0x11,
+ DW_OP_dup = 0x12,
+ DW_OP_drop = 0x13,
+ DW_OP_over = 0x14,
+ DW_OP_pick = 0x15,
+ DW_OP_swap = 0x16,
+ DW_OP_rot = 0x17,
+ DW_OP_xderef = 0x18,
+ DW_OP_abs = 0x19,
+ DW_OP_and = 0x1a,
+ DW_OP_div = 0x1b,
+ DW_OP_minus = 0x1c,
+ DW_OP_mod = 0x1d,
+ DW_OP_mul = 0x1e,
+ DW_OP_neg = 0x1f,
+ DW_OP_not = 0x20,
+ DW_OP_or = 0x21,
+ DW_OP_plus = 0x22,
+ DW_OP_plus_uconst = 0x23,
+ DW_OP_shl = 0x24,
+ DW_OP_shr = 0x25,
+ DW_OP_shra = 0x26,
+ DW_OP_xor = 0x27,
+ DW_OP_bra = 0x28,
+ DW_OP_eq = 0x29,
+ DW_OP_ge = 0x2a,
+ DW_OP_gt = 0x2b,
+ DW_OP_le = 0x2c,
+ DW_OP_lt = 0x2d,
+ DW_OP_ne = 0x2e,
+ DW_OP_skip = 0x2f,
+ DW_OP_lit0 = 0x30,
+ DW_OP_lit1 = 0x31,
+ DW_OP_lit2 = 0x32,
+ DW_OP_lit3 = 0x33,
+ DW_OP_lit4 = 0x34,
+ DW_OP_lit5 = 0x35,
+ DW_OP_lit6 = 0x36,
+ DW_OP_lit7 = 0x37,
+ DW_OP_lit8 = 0x38,
+ DW_OP_lit9 = 0x39,
+ DW_OP_lit10 = 0x3a,
+ DW_OP_lit11 = 0x3b,
+ DW_OP_lit12 = 0x3c,
+ DW_OP_lit13 = 0x3d,
+ DW_OP_lit14 = 0x3e,
+ DW_OP_lit15 = 0x3f,
+ DW_OP_lit16 = 0x40,
+ DW_OP_lit17 = 0x41,
+ DW_OP_lit18 = 0x42,
+ DW_OP_lit19 = 0x43,
+ DW_OP_lit20 = 0x44,
+ DW_OP_lit21 = 0x45,
+ DW_OP_lit22 = 0x46,
+ DW_OP_lit23 = 0x47,
+ DW_OP_lit24 = 0x48,
+ DW_OP_lit25 = 0x49,
+ DW_OP_lit26 = 0x4a,
+ DW_OP_lit27 = 0x4b,
+ DW_OP_lit28 = 0x4c,
+ DW_OP_lit29 = 0x4d,
+ DW_OP_lit30 = 0x4e,
+ DW_OP_lit31 = 0x4f,
+ DW_OP_reg0 = 0x50,
+ DW_OP_reg1 = 0x51,
+ DW_OP_reg2 = 0x52,
+ DW_OP_reg3 = 0x53,
+ DW_OP_reg4 = 0x54,
+ DW_OP_reg5 = 0x55,
+ DW_OP_reg6 = 0x56,
+ DW_OP_reg7 = 0x57,
+ DW_OP_reg8 = 0x58,
+ DW_OP_reg9 = 0x59,
+ DW_OP_reg10 = 0x5a,
+ DW_OP_reg11 = 0x5b,
+ DW_OP_reg12 = 0x5c,
+ DW_OP_reg13 = 0x5d,
+ DW_OP_reg14 = 0x5e,
+ DW_OP_reg15 = 0x5f,
+ DW_OP_reg16 = 0x60,
+ DW_OP_reg17 = 0x61,
+ DW_OP_reg18 = 0x62,
+ DW_OP_reg19 = 0x63,
+ DW_OP_reg20 = 0x64,
+ DW_OP_reg21 = 0x65,
+ DW_OP_reg22 = 0x66,
+ DW_OP_reg23 = 0x67,
+ DW_OP_reg24 = 0x68,
+ DW_OP_reg25 = 0x69,
+ DW_OP_reg26 = 0x6a,
+ DW_OP_reg27 = 0x6b,
+ DW_OP_reg28 = 0x6c,
+ DW_OP_reg29 = 0x6d,
+ DW_OP_reg30 = 0x6e,
+ DW_OP_reg31 = 0x6f,
+ DW_OP_breg0 = 0x70,
+ DW_OP_breg1 = 0x71,
+ DW_OP_breg2 = 0x72,
+ DW_OP_breg3 = 0x73,
+ DW_OP_breg4 = 0x74,
+ DW_OP_breg5 = 0x75,
+ DW_OP_breg6 = 0x76,
+ DW_OP_breg7 = 0x77,
+ DW_OP_breg8 = 0x78,
+ DW_OP_breg9 = 0x79,
+ DW_OP_breg10 = 0x7a,
+ DW_OP_breg11 = 0x7b,
+ DW_OP_breg12 = 0x7c,
+ DW_OP_breg13 = 0x7d,
+ DW_OP_breg14 = 0x7e,
+ DW_OP_breg15 = 0x7f,
+ DW_OP_breg16 = 0x80,
+ DW_OP_breg17 = 0x81,
+ DW_OP_breg18 = 0x82,
+ DW_OP_breg19 = 0x83,
+ DW_OP_breg20 = 0x84,
+ DW_OP_breg21 = 0x85,
+ DW_OP_breg22 = 0x86,
+ DW_OP_breg23 = 0x87,
+ DW_OP_breg24 = 0x88,
+ DW_OP_breg25 = 0x89,
+ DW_OP_breg26 = 0x8a,
+ DW_OP_breg27 = 0x8b,
+ DW_OP_breg28 = 0x8c,
+ DW_OP_breg29 = 0x8d,
+ DW_OP_breg30 = 0x8e,
+ DW_OP_breg31 = 0x8f,
+ DW_OP_regx = 0x90,
+ DW_OP_fbreg = 0x91,
+ DW_OP_bregx = 0x92,
+ DW_OP_piece = 0x93,
+ DW_OP_deref_size = 0x94,
+ DW_OP_xderef_size = 0x95,
+ DW_OP_nop = 0x96,
+ /* DWARF 3 extensions. */
+ DW_OP_push_object_address = 0x97,
+ DW_OP_call2 = 0x98,
+ DW_OP_call4 = 0x99,
+ DW_OP_call_ref = 0x9a,
+ DW_OP_form_tls_address = 0x9b,
+ DW_OP_call_frame_cfa = 0x9c,
+ DW_OP_bit_piece = 0x9d,
+ /* GNU extensions. */
+ DW_OP_GNU_push_tls_address = 0xe0,
+ /* HP extensions. */
+ DW_OP_HP_unknown = 0xe0, /* Ouch, the same as GNU_push_tls_address. */
+ DW_OP_HP_is_value = 0xe1,
+ DW_OP_HP_fltconst4 = 0xe2,
+ DW_OP_HP_fltconst8 = 0xe3,
+ DW_OP_HP_mod_range = 0xe4,
+ DW_OP_HP_unmod_range = 0xe5,
+ DW_OP_HP_tls = 0xe6
+ };
+
+
+/* Convert the DWARF3 expression in expr[0 .. exprlen-1] into a dag
+ (of CfiExprs) stored in ctx->exprs, and return the index in
+ ctx->exprs of the root node. Or fail in which case return -1. */
+
+static Int dwarfexpr_to_dag ( UnwindContext* ctx,
+ UChar* expr, Int exprlen,
+ Bool push_cfa_at_start,
+ Bool ddump_frames )
+{
+# define N_EXPR_STACK 20
+
+# define PUSH(_arg) \
+ do { \
+ vg_assert(sp >= -1 && sp < N_EXPR_STACK); \
+ if (sp == N_EXPR_STACK-1) \
+ return -1; \
+ sp++; \
+ stack[sp] = (_arg); \
+ } while (0)
+
+# define POP(_lval) \
+ do { \
+ vg_assert(sp >= -1 && sp < N_EXPR_STACK); \
+ if (sp == -1) \
+ return -1; \
+ _lval = stack[sp]; \
+ sp--; \
+ } while (0)
+
+ Int ix, ix2, reg;
+ UChar opcode;
+ Word sw;
+
+ Int sp; /* # of top element: valid is -1 .. N_EXPR_STACK-1 */
+ Int stack[N_EXPR_STACK]; /* indices into ctx->exprs */
+
+ XArray* dst = ctx->exprs;
+ UChar* limit = expr + exprlen;
+
+ vg_assert(dst);
+ vg_assert(exprlen >= 0);
+
+ sp = -1; /* empty */
+
+ /* Synthesise the CFA as a CfiExpr */
+ if (push_cfa_at_start) {
+ if (ctx->cfa_is_regoff) {
+ /* cfa is reg +/- offset */
+ ix = ML_(CfiExpr_Binop)( dst,
+ Cop_Add,
+ ML_(CfiExpr_DwReg)( dst, ctx->cfa_reg ),
+ ML_(CfiExpr_Const)( dst, (UWord)(Word)ctx->cfa_off )
+ );
+ PUSH(ix);
+ } else {
+ /* CFA is already an expr; use its root node */
+ PUSH(ctx->cfa_expr_ix);
+ }
+ }
+
+ while (True) {
+
+ vg_assert(sp >= -1 && sp < N_EXPR_STACK);
+
+ if (expr > limit)
+ return -1; /* overrun - something's wrong */
+
+ if (expr == limit) {
+ /* end of expr - return expr on the top of stack. */
+ if (sp == -1)
+ return -1; /* stack empty. Bad. */
+ else
+ break;
+ }
+
+ opcode = *expr++;
+ switch (opcode) {
+
+ case DW_OP_breg0 ... DW_OP_breg31:
+ /* push: reg + sleb128 */
+ reg = (Int)opcode - (Int)DW_OP_breg0;
+ vg_assert(reg >= 0 && reg <= 31);
+ sw = read_leb128S( &expr );
+ ix = ML_(CfiExpr_Binop)( dst,
+ Cop_Add,
+ ML_(CfiExpr_DwReg)( dst, reg ),
+ ML_(CfiExpr_Const)( dst, (UWord)sw )
+ );
+ PUSH(ix);
+ if (ddump_frames)
+ VG_(printf)("DW_OP_breg%d: %ld", reg, sw);
+ break;
+
+ case DW_OP_const4s:
+ /* push: 32-bit signed immediate */
+ sw = read_le_s_encoded_literal( expr, 4 );
+ expr += 4;
+ PUSH( ML_(CfiExpr_Const)( dst, (UWord)sw ) );
+ if (ddump_frames)
+ VG_(printf)("DW_OP_const4s: %ld", sw);
+ break;
+
+ case DW_OP_minus:
+ POP( ix );
+ POP( ix2 );
+ PUSH( ML_(CfiExpr_Binop)( dst, Cop_Sub, ix2, ix ) );
+ if (ddump_frames)
+ VG_(printf)("DW_OP_minus");
+ break;
+
+ case DW_OP_plus:
+ POP( ix );
+ POP( ix2 );
+ PUSH( ML_(CfiExpr_Binop)( dst, Cop_Add, ix2, ix ) );
+ if (ddump_frames)
+ VG_(printf)("DW_OP_plus");
+ break;
+
+ default:
+ if (ddump_frames /* || trace_cfi*/)
+ VG_(printf)("XXX unhandled dwarf expr opcode 0x%x\n",
+ (Int)opcode );
+ return -1;
+ }
+
+ if (expr < limit && ddump_frames)
+ VG_(printf)("; ");
+
+ }
+
+ vg_assert(sp >= -1 && sp < N_EXPR_STACK);
+ if (sp == -1)
+ return -1;
+
+ if (0 && ddump_frames)
+ ML_(ppCfiExpr)( dst, stack[sp] );
+ return stack[sp];
+
+# undef POP
+# undef PUSH
+# undef N_EXPR_STACK
+}
+
+
/* ------------ Run/show CFI instructions ------------ */
/* Run a CFI instruction, and also return its length.
@@ -2243,12 +2707,14 @@
AddressDecodingInfo* adi,
struct _SegInfo* si )
{
- Int off, reg, reg2, nleb, len;
- UInt delta;
- Int i = 0;
- UChar hi2 = (instr[i] >> 6) & 3;
- UChar lo6 = instr[i] & 0x3F;
- Addr printing_bias = ((Addr)ctx->initloc) - ((Addr)si->text_bias);
+ Int off, reg, reg2, nleb, len;
+ UInt delta;
+ UChar* expr;
+ Int j;
+ Int i = 0;
+ UChar hi2 = (instr[i] >> 6) & 3;
+ UChar lo6 = instr[i] & 0x3F;
+ Addr printing_bias = ((Addr)ctx->initloc) - ((Addr)si->text_bias);
i++;
if (hi2 == DW_CFA_advance_loc) {
@@ -2261,18 +2727,18 @@
}
if (hi2 == DW_CFA_offset) {
- /* Set rule for reg 'lo6' to CFAoffset(off * data_af) */
+ /* Set rule for reg 'lo6' to CFAOff(off * data_af) */
off = read_leb128( &instr[i], &nleb, 0 );
i += nleb;
reg = (Int)lo6;
if (reg < 0 || reg >= N_CFI_REGS)
return 0; /* fail */
- ctx->reg[reg].tag = RR_CFAoff;
- ctx->reg[reg].coff = off * ctx->data_a_f;
+ ctx->reg[reg].tag = RR_CFAOff;
+ ctx->reg[reg].arg = off * ctx->data_a_f;
if (si->ddump_frames)
VG_(printf)(" DW_CFA_offset: r%d at cfa%s%d\n",
- (Int)reg, ctx->reg[reg].coff < 0 ? "" : "+",
- (Int)ctx->reg[reg].coff );
+ (Int)reg, ctx->reg[reg].arg < 0 ? "" : "+",
+ (Int)ctx->reg[reg].arg );
return i;
}
@@ -2336,8 +2802,10 @@
i += nleb;
if (reg < 0 || reg >= N_CFI_REGS)
return 0; /* fail */
- ctx->cfa_reg = reg;
- ctx->cfa_offset = off;
+ ctx->cfa_is_regoff = True;
+ ctx->cfa_expr_ix = 0;
+ ctx->cfa_reg = reg;
+ ctx->cfa_off = off;
if (si->ddump_frames)
VG_(printf)(" DW_CFA_def_cfa: r%d ofs %d\n", (Int)reg, (Int)off);
break;
@@ -2349,8 +2817,10 @@
i += nleb;
if (reg < 0 || reg >= N_CFI_REGS)
return 0; /* fail */
- ctx->cfa_reg = reg;
- ctx->cfa_offset = off * ctx->data_a_f;
+ ctx->cfa_is_regoff = True;
+ ctx->cfa_expr_ix = 0;
+ ctx->cfa_reg = reg;
+ ctx->cfa_off = off * ctx->data_a_f;
if (si->ddump_frames)
VG_(printf)(" rci:DW_CFA_def_cfa_sf\n");
break;
@@ -2365,9 +2835,10 @@
if (reg2 < 0 || reg2 >= N_CFI_REGS)
return 0; /* fail */
ctx->reg[reg].tag = RR_Reg;
- ctx->reg[reg].reg = reg2;
+ ctx->reg[reg].arg = reg2;
if (si->ddump_frames)
- VG_(printf)(" rci:DW_CFA_register\n");
+ VG_(printf)(" DW_CFA_register: r%d in r%d\n",
+ (Int)reg, (Int)reg2);
break;
case DW_CFA_offset_extended:
@@ -2377,8 +2848,8 @@
i += nleb;
if (reg < 0 || reg >= N_CFI_REGS)
return 0; /* fail */
- ctx->reg[reg].tag = RR_CFAoff;
- ctx->reg[reg].coff = off * ctx->data_a_f;
+ ctx->reg[reg].tag = RR_CFAOff;
+ ctx->reg[reg].arg = off * ctx->data_a_f;
if (si->ddump_frames)
VG_(printf)(" rci:DW_CFA_offset_extended\n");
break;
@@ -2390,12 +2861,12 @@
i += nleb;
if (reg < 0 || reg >= N_CFI_REGS)
return 0; /* fail */
- ctx->reg[reg].tag = RR_CFAoff;
- ctx->reg[reg].coff = off * ctx->data_a_f;
+ ctx->reg[reg].tag = RR_CFAOff;
+ ctx->reg[reg].arg = off * ctx->data_a_f;
if (si->ddump_frames)
VG_(printf)(" DW_CFA_offset_extended_sf: r%d at cfa%s%d\n",
- reg, ctx->reg[reg].coff < 0 ? "" : "+",
- (Int)ctx->reg[reg].coff);
+ reg, ctx->reg[reg].arg < 0 ? "" : "+",
+ (Int)ctx->reg[reg].arg);
break;
case DW_CFA_GNU_negative_offset_extended:
@@ -2405,8 +2876,8 @@
i += nleb;
if (reg < 0 || reg >= N_CFI_REGS)
return 0; /* fail */
- ctx->reg[reg].tag = RR_CFAoff;
- ctx->reg[reg].coff = -off * ctx->data_a_f;
+ ctx->reg[reg].tag = RR_CFAOff;
+ ctx->reg[reg].arg = (-off) * ctx->data_a_f;
if (si->ddump_frames)
VG_(printf)(" rci:DW_CFA_GNU_negative_offset_extended\n");
break;
@@ -2430,8 +2901,8 @@
i += nleb;
if (reg < 0 || reg >= N_CFI_REGS)
return 0; /* fail */
- ctx->reg[reg].tag = RR_CFAValoff;
- ctx->reg[reg].coff = off * ctx->data_a_f;
+ ctx->reg[reg].tag = RR_CFAValOff;
+ ctx->reg[reg].arg = off * ctx->data_a_f;
if (si->ddump_frames)
VG_(printf)(" rci:DW_CFA_val_offset\n");
break;
@@ -2443,8 +2914,8 @@
i += nleb;
if (reg < 0 || reg >= N_CFI_REGS)
return 0; /* fail */
- ctx->reg[reg].tag = RR_CFAValoff;
- ctx->reg[reg].coff = off * ctx->data_a_f;
+ ctx->reg[reg].tag = RR_CFAValOff;
+ ctx->reg[reg].arg = off * ctx->data_a_f;
if (si->ddump_frames)
VG_(printf)(" rci:DW_CFA_val_offset_sf\n");
break;
@@ -2454,7 +2925,10 @@
i += nleb;
if (reg < 0 || reg >= N_CFI_REGS)
return 0; /* fail */
- ctx->cfa_reg = reg;
+ ctx->cfa_is_regoff = True;
+ ctx->cfa_expr_ix = 0;
+ ctx->cfa_reg = reg;
+ /* ->cfa_off unchanged */
if (si->ddump_frames)
VG_(printf)(" DW_CFA_def_cfa_reg: r%d\n", (Int)reg );
break;
@@ -2462,7 +2936,10 @@
case DW_CFA_def_cfa_offset:
off = read_leb128( &instr[i], &nleb, 0);
i += nleb;
- ctx->cfa_offset = off;
+ ctx->cfa_is_regoff = True;
+ ctx->cfa_expr_ix = 0;
+ /* ->reg is unchanged */
+ ctx->cfa_off = off;
if (si->ddump_frames)
VG_(printf)(" DW_CFA_def_cfa_offset: %d\n", (Int)off);
break;
@@ -2470,9 +2947,12 @@
case DW_CFA_def_cfa_offset_sf:
off = read_leb128( &instr[i], &nleb, 1);
i += nleb;
- ctx->cfa_offset = off * ctx->data_a_f;
+ ctx->cfa_is_regoff = True;
+ ctx->cfa_expr_ix = 0;
+ /* ->reg is unchanged */
+ ctx->cfa_off = off * ctx->data_a_f;
if (si->ddump_frames)
- VG_(printf)(" DW_CFA_def_cfa_offset_sf: %d\n", ctx->cfa_offset);
+ VG_(printf)(" DW_CFA_def_cfa_offset_sf: %d\n", ctx->cfa_off);
break;
case DW_CFA_undefined:
@@ -2481,8 +2961,7 @@
if (reg < 0 || reg >= N_CFI_REGS)
return 0; /* fail */
ctx->reg[reg].tag = RR_Undef;
- ctx->reg[reg].coff = 0;
- ctx->reg[reg].reg = 0;
+ ctx->reg[reg].arg = 0;
if (si->ddump_frames)
VG_(printf)(" rci:DW_CFA_undefined\n");
break;
@@ -2515,22 +2994,32 @@
break;
case DW_CFA_val_expression:
- /* Too difficult to really handle; just skip over it and say
- that we don't know what do to with the register. */
- if (si->trace_cfi)
- VG_(printf)("DWARF2 CFI reader: "
- "ignoring DW_CFA_val_expression\n");
reg = read_leb128( &instr[i], &nleb, 0 );
i += nleb;
len = read_leb128( &instr[i], &nleb, 0 );
i += nleb;
+ expr = &instr[i];
i += len;
if (reg < 0 || reg >= N_CFI_REGS)
return 0; /* fail */
- ctx->reg[reg].tag = RR_ValExpr;
if (si->ddump_frames)
- VG_(printf)(" DW_CFA_val_expression: r%d (ignored)\n",
+ VG_(printf)(" DW_CFA_val_expression: r%d (",
(Int)reg);
+ /* Convert the expression into a dag rooted at ctx->exprs index j,
+ or fail. */
+ j = dwarfexpr_to_dag ( ctx, expr, len, True/*push CFA at start*/,
+ si->ddump_frames);
+ if (si->ddump_frames)
+ VG_(printf)(")\n");
+ vg_assert(j >= -1);
+ if (j >= 0) {
+ vg_assert(ctx->exprs);
+ vg_assert( j < VG_(sizeXA)(ctx->exprs) );
+ }
+ if (j == -1)
+ return 0; /* fail */
+ ctx->reg[reg].tag = RR_ValExpr;
+ ctx->reg[reg].arg = j;
break;
case DW_CFA_def_cfa_expression:
@@ -2540,7 +3029,10 @@
len = read_leb128( &instr[i], &nleb, 0 );
i += nleb;
i += len;
- ctx->cfa_reg = -1; /* indicating we don't know */
+ ctx->cfa_is_regoff = False;
+ ctx->cfa_reg = 0;
+ ctx->cfa_off = 0;
+ ctx->cfa_expr_ix = -1; /* invalid - should handle properly */
if (si->ddump_frames)
VG_(printf)(" rci:DW_CFA_def_cfa_expression (ignored)\n");
break;
@@ -2840,7 +3332,7 @@
if (summ_ok) {
ML_(addDiCfSI)(si, &cfsi);
if (si->trace_cfi)
- ML_(ppDiCfSI)(&cfsi);
+ ML_(ppDiCfSI)(si->cfsi_exprs, &cfsi);
}
}
}
@@ -2852,7 +3344,7 @@
if (summ_ok) {
ML_(addDiCfSI)(si, &cfsi);
if (si->trace_cfi)
- ML_(ppDiCfSI)(&cfsi);
+ ML_(ppDiCfSI)(si->cfsi_exprs, &cfsi);
}
}
}
@@ -3237,7 +3729,7 @@
switch (ptr_size) {
case 8: case 4: case 2: case 1:
fde_arange
- = (UWord)read_le_encoded_literal(data, ptr_size);
+ = (UWord)read_le_u_encoded_literal(data, ptr_size);
data += ptr_size;
break;
default:
@@ -3300,6 +3792,9 @@
ctx.data_a_f = the_CIEs[cie].data_a_f;
ctx.initloc = fde_initloc;
ctx.ra_reg = the_CIEs[cie].ra_reg;
+ ctx.exprs = VG_(newXA)( symtab_alloc, symtab_free,
+ sizeof(CfiExpr) );
+ vg_assert(ctx.exprs);
/* Run the CIE's instructions. Ugly hack: if
--debug-dump=frames is in effect, suppress output for
@@ -3328,6 +3823,8 @@
if (si->ddump_frames)
VG_(printf)("\n");
}
+
+ VG_(deleteXA)( ctx.exprs );
}
}
Modified: trunk/coregrind/m_debuginfo/readelf.c
===================================================================
--- trunk/coregrind/m_debuginfo/readelf.c 2007-02-27 16:40:53 UTC (rev 6619)
+++ trunk/coregrind/m_debuginfo/readelf.c 2007-02-27 16:52:23 UTC (rev 6620)
@@ -46,6 +46,7 @@
#include "pub_core_options.h"
#include "pub_core_oset.h"
#include "pub_core_tooliface.h" /* VG_(needs) */
+#include "pub_core_xarray.h"
#include "priv_storage.h"
#include "priv_readelf.h" /* self */
#include "priv_readdwarf.h" /* 'cos ELF contains DWARF */
Modified: trunk/coregrind/m_debuginfo/readstabs.c
===================================================================
--- trunk/coregrind/m_debuginfo/readstabs.c 2007-02-27 16:40:53 UTC (rev 6619)
+++ trunk/coregrind/m_debuginfo/readstabs.c 2007-02-27 16:52:23 UTC (rev 6620)
@@ -39,6 +39,7 @@
#include "pub_core_libcassert.h"
#include "pub_core_libcprint.h"
#include "pub_core_mallocfree.h"
+#include "pub_core_xarray.h"
#include "priv_storage.h"
#include "priv_readstabs.h" /* self */
Modified: trunk/coregrind/m_debuginfo/storage.c
===================================================================
--- trunk/coregrind/m_debuginfo/storage.c 2007-02-27 16:40:53 UTC (rev 6619)
+++ trunk/coregrind/m_debuginfo/storage.c 2007-02-27 16:52:23 UTC (rev 6620)
@@ -1,7 +1,7 @@
/*--------------------------------------------------------------------*/
/*--- Format-neutral storage of and querying of info acquired from ---*/
-/*--- ELF/XCOFF stabs/dwarf1/dwarf2 debug info. ---*/
+/*--- ELF/XCOFF stabs/dwarf1/dwarf2/dwarf3 debug info. ---*/
/*--- storage.c ---*/
/*--------------------------------------------------------------------*/
@@ -43,6 +43,7 @@
#include "pub_core_libcbase.h"
#include "pub_core_libcprint.h"
#include "pub_core_mallocfree.h"
+#include "pub_core_xarray.h"
#include "priv_storage.h" /* self */
@@ -69,7 +70,7 @@
}
/* Print a call-frame-info summary. */
-void ML_(ppDiCfSI) ( DiCfSI* si )
+void ML_(ppDiCfSI) ( XArray* /* of CfiExpr */ exprs, DiCfSI* si )
{
# define SHOW_HOW(_how, _off) \
do { \
@@ -84,15 +85,34 @@
} else \
if (_how == CFIR_MEMCFAREL) { \
VG_(printf)("*(cfa+%d)", _off); \
+ } else \
+ if (_how == CFIR_EXPR) { \
+ VG_(printf)("{"); \
+ ML_(ppCfiExpr)(exprs, _off); \
+ VG_(printf)("}"); \
} else { \
- VG_(printf)("???"); \
+ vg_assert(0+0); \
} \
} while (0)
VG_(printf)("[%p .. %p]: ", si->base,
si->base + (UWord)si->len - 1);
- VG_(printf)("let cfa=%s+%d",
- si->cfa_sprel ? "oldSP" : "oldFP", si->cfa_off);
+ switch (si->cfa_how) {
+ case CFIC_SPREL:
+ VG_(printf)("let cfa=oldSP+%d", si->cfa_off);
+ break;
+ case CFIC_FPREL:
+ VG_(printf)("let cfa=oldFP+%d", si->cfa_off);
+ break;
+ case CFIC_EXPR:
+ VG_(printf)("let cfa={");
+ ML_(ppCfiExpr)(exprs, si->cfa_off);
+ VG_(printf)("}");
+ break;
+ default:
+ vg_assert(0);
+ }
+
VG_(printf)(" in RA=");
SHOW_HOW(si->ra_how, si->ra_off);
VG_(printf)(" SP=");
@@ -308,7 +328,7 @@
if (debug) {
VG_(printf)("adding DiCfSI: ");
- ML_(ppDiCfSI)(cfsi);
+ ML_(ppDiCfSI)(si->cfsi_exprs, cfsi);
}
/* sanity */
@@ -338,7 +358,7 @@
);
}
if (VG_(clo_trace_cfi))
- ML_(ppDiCfSI)(cfsi);
+ ML_(ppDiCfSI)(si->cfsi_exprs, cfsi);
}
return;
}
@@ -362,6 +382,116 @@
}
+Int ML_(CfiExpr_Undef)( XArray* dst )
+{
+ CfiExpr e;
+ VG_(memset)( &e, 0, sizeof(e) );
+ e.tag = Cex_Undef;
+ return VG_(addToXA)( dst, &e );
+}
+Int ML_(CfiExpr_Deref)( XArray* dst, Int ixAddr )
+{
+ CfiExpr e;
+ VG_(memset)( &e, 0, sizeof(e) );
+ e.tag = Cex_Deref;
+ e.Cex.Deref.ixAddr = ixAddr;
+ return VG_(addToXA)( dst, &e );
+}
+Int ML_(CfiExpr_Const)( XArray* dst, UWord con )
+{
+ CfiExpr e;
+ VG_(memset)( &e, 0, sizeof(e) );
+ e.tag = Cex_Const;
+ e.Cex.Const.con = con;
+ return VG_(addToXA)( dst, &e );
+}
+Int ML_(CfiExpr_Binop)( XArray* dst, CfiOp op, Int ixL, Int ixR )
+{
+ CfiExpr e;
+ VG_(memset)( &e, 0, sizeof(e) );
+ e.tag = Cex_Binop;
+ e.Cex.Binop.op = op;
+ e.Cex.Binop.ixL = ixL;
+ e.Cex.Binop.ixR = ixR;
+ return VG_(addToXA)( dst, &e );
+}
+Int ML_(CfiExpr_CfiReg)( XArray* dst, CfiReg reg )
+{
+ CfiExpr e;
+ VG_(memset)( &e, 0, sizeof(e) );
+ e.tag = Cex_CfiReg;
+ e.Cex.CfiReg.reg = reg;
+ return VG_(addToXA)( dst, &e );
+}
+Int ML_(CfiExpr_DwReg)( XArray* dst, Int reg )
+{
+ CfiExpr e;
+ VG_(memset)( &e, 0, sizeof(e) );
+ e.tag = Cex_DwReg;
+ e.Cex.DwReg.reg = reg;
+ return VG_(addToXA)( dst, &e );
+}
+
+static void ppCfiOp ( CfiOp op )
+{
+ switch (op) {
+ case Cop_Add: VG_(printf)("+"); break;
+ case Cop_Sub: VG_(printf)("-"); break;
+ case Cop_And: VG_(printf)("&"); break;
+ default: vg_assert(0);
+ }
+}
+
+static void ppCfiReg ( CfiReg reg )
+{
+ switch (reg) {
+ case Creg_SP: VG_(printf)("SP"); break;
+ case Creg_FP: VG_(printf)("FP"); break;
+ case Creg_IP: VG_(printf)("IP"); break;
+ default: vg_assert(0);
+ }
+}
+
+void ML_(ppCfiExpr)( XArray* src, Int ix )
+{
+ /* VG_(indexXA) checks for invalid src/ix values, so we can
+ use it indiscriminately. */
+ CfiExpr* e = (CfiExpr*) VG_(indexXA)( src, ix );
+ switch (e->tag) {
+ case Cex_Undef:
+ VG_(printf)("Undef");
+ break;
+ case Cex_Deref:
+ VG_(printf)("*(");
+ ML_(ppCfiExpr)(src, e->Cex.Deref.ixAddr);
+ VG_(printf)(")");
+ break;
+ case Cex_Const:
+ VG_(printf)("0x%lx", e->Cex.Const.con);
+ break;
+ case Cex_Binop:
+ VG_(printf)("(");
+ ML_(ppCfiExpr)(src, e->Cex.Binop.ixL);
+ VG_(printf)(")");
+ ppCfiOp(e->Cex.Binop.op);
+ VG_(printf)("(");
+ ML_(ppCfiExpr)(src, e->Cex.Binop.ixR);
+ VG_(printf)(")");
+ break;
+ case Cex_CfiReg:
+ ppCfiReg(e->Cex.CfiReg.reg);
+ break;
+ case Cex_DwReg:
+ VG_(printf)("dwr%d", e->Cex.DwReg.reg);
+ break;
+ default:
+ VG_(core_panic)("ML_(ppCfiExpr)");
+ /*NOTREACHED*/
+ break;
+ }
+}
+
+
/*------------------------------------------------------------*/
/*--- Canonicalisers ---*/
/*------------------------------------------------------------*/
|
|
From: <sv...@va...> - 2007-02-27 16:40:58
|
Author: sewardj
Date: 2007-02-27 16:40:53 +0000 (Tue, 27 Feb 2007)
New Revision: 6619
Log:
VG_(addToXA): return index in the array where the item was added.
Modified:
trunk/coregrind/m_commandline.c
trunk/coregrind/m_xarray.c
trunk/include/pub_tool_xarray.h
Modified: trunk/coregrind/m_commandline.c
===================================================================
--- trunk/coregrind/m_commandline.c 2007-02-26 00:16:09 UTC (rev 6618)
+++ trunk/coregrind/m_commandline.c 2007-02-27 16:40:53 UTC (rev 6619)
@@ -45,7 +45,7 @@
static void add_string ( XArray* /* of HChar* */xa, HChar* str )
{
- VG_(addToXA)( xa, (void*)(&str) );
+ (void) VG_(addToXA)( xa, (void*)(&str) );
}
Modified: trunk/coregrind/m_xarray.c
===================================================================
--- trunk/coregrind/m_xarray.c 2007-02-26 00:16:09 UTC (rev 6618)
+++ trunk/coregrind/m_xarray.c 2007-02-27 16:40:53 UTC (rev 6619)
@@ -104,7 +104,7 @@
return ((char*)xa->arr) + n * xa->elemSzB;
}
-void VG_(addToXA) ( XArray* xao, void* elem )
+Int VG_(addToXA) ( XArray* xao, void* elem )
{
struct _XArray* xa = (struct _XArray*)xao;
vg_assert(xa);
@@ -137,6 +137,7 @@
elem, xa->elemSzB );
xa->usedsizeE++;
xa->sorted = False;
+ return xa->usedsizeE-1;
}
// Generic shell sort. Like stdlib.h's qsort().
Modified: trunk/include/pub_tool_xarray.h
===================================================================
--- trunk/include/pub_tool_xarray.h 2007-02-26 00:16:09 UTC (rev 6618)
+++ trunk/include/pub_tool_xarray.h 2007-02-27 16:40:53 UTC (rev 6619)
@@ -61,8 +61,10 @@
before making further queries with lookupXA. */
extern void VG_(setCmpFnXA) ( XArray*, Word (*compar)(void*,void*) );
-/* Add an element to an XArray. Element is copied into the XArray. */
-extern void VG_(addToXA) ( XArray*, void* elem );
+/* Add an element to an XArray. Element is copied into the XArray.
+ Index at which it was added is returned. Note this will be
+ invalidated if the array is later sortXA'd. */
+extern Int VG_(addToXA) ( XArray*, void* elem );
/* Sort an XArray using its comparison function, if set; else bomb.
Probably not a stable sort w.r.t. equal elements module cmpFn. */
|
|
From: Bart V. A. <bar...@gm...> - 2007-02-27 13:51:57
|
A new drd version is available at the following location: http://home.euphonynet.be/bvassche/valgrind/valgrind-6618-drd-2007-02-27.patch.gz Changes compared to version 2007-02-22: - Eliminated AMD64 false positives -- drd now behaves consistently on X86 and AMD64. - Started optimizing the bitmap implementation in drd -- drd now works several times faster for clients with 10 threads or more. More work has to be done in this area however. (Only bm_clear() and bm_has_access() have been optimized. According to cachegrind, VG_(OSet_Next)() is now the function that consumes most CPU cycles.) - The soft link in .in_place/drd/default.supp is now created automatically -- drd's default suppression file is not yet automatically installed in the installation directory. - Specifying Valgrind's option -v no longer triggers a crash in drd. - Defined new pthread_pre_create tracking function. - New command-line option: --trace-suppression. Most important known bugs: - drd is soon killed by the OOM handler when started with bigger clients. - drd/default.supp has to be installed manually in the installation dir. An example of how the patch can be applied and the regression tests can be run: svn co svn://svn.valgrind.org/valgrind/trunk valgrind cd valgrind gzip -cd ../valgrind-6618-drd-2007-02-27.patch.gz | patch -p0 - ./autogen.sh ./configure --prefix=$PWD/inst make -s make -s check chmod a+x drd/tests/filter_stderr perl tests/vg_regtest drd -- Regards, Bart Van Assche. |
|
From: <js...@ac...> - 2007-02-27 10:06:58
|
Nightly build on minnie ( SuSE 10.0, ppc32 ) started at 2007-02-27 09: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 == 219 tests, 10 stderr failures, 6 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/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: <js...@ac...> - 2007-02-27 05:32:01
|
Nightly build on phoenix ( SuSE 10.0 ) started at 2007-02-27 04:55: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 == 254 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: Tom H. <th...@cy...> - 2007-02-27 03:23:35
|
Nightly build on dellow ( x86_64, Fedora Core 6 ) started at 2007-02-27 03:10:05 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 == 288 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) |
|
From: Tom H. <th...@cy...> - 2007-02-27 03:22:57
|
Nightly build on alvis ( i686, Red Hat 7.3 ) started at 2007-02-27 03:15:02 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/cc0Iouj1.s:4393: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/cc0Iouj1.s:4513: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/cc0Iouj1.s:4633: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/cc0Iouj1.s:4753: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/cc0Iouj1.s:4873: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/cc0Iouj1.s:4993: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/cc0Iouj1.s:5113: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/cc0Iouj1.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.30568/valgrind/none/tests/x86' make[4]: *** [check-am] Error 2 make[4]: Leaving directory `/tmp/valgrind.30568/valgrind/none/tests/x86' make[3]: *** [check-recursive] Error 1 make[3]: Leaving directory `/tmp/valgrind.30568/valgrind/none/tests' make[2]: *** [check-recursive] Error 1 make[2]: Leaving directory `/tmp/valgrind.30568/valgrind/none' make[1]: *** [check-recursive] Error 1 make[1]: Leaving directory `/tmp/valgrind.30568/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/ccZAXoX9.s:4393: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/ccZAXoX9.s:4513: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/ccZAXoX9.s:4633: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/ccZAXoX9.s:4753: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/ccZAXoX9.s:4873: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/ccZAXoX9.s:4993: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/ccZAXoX9.s:5113: Error: no such instruction: `fisttpq -56(%ebp)' /tmp/ccZAXoX9.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.30568/valgrind/none/tests/x86' make[4]: *** [check-am] Error 2 make[4]: Leaving directory `/tmp/valgrind.30568/valgrind/none/tests/x86' make[3]: *** [check-recursive] Error 1 make[3]: Leaving directory `/tmp/valgrind.30568/valgrind/none/tests' make[2]: *** [check-recursive] Error 1 make[2]: Leaving directory `/tmp/valgrind.30568/valgrind/none' make[1]: *** [check-recursive] Error 1 make[1]: Leaving directory `/tmp/valgrind.30568/valgrind' make: *** [check] Error 2 ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short Tue Feb 27 03:18:58 2007 --- new.short Tue Feb 27 03:22:48 2007 *************** *** 7,16 **** Last 20 lines of verbose log follow echo ! /tmp/ccZAXoX9.s:4393: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/ccZAXoX9.s:4513: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/ccZAXoX9.s:4633: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/ccZAXoX9.s:4753: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/ccZAXoX9.s:4873: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/ccZAXoX9.s:4993: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/ccZAXoX9.s:5113: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/ccZAXoX9.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/cc0Iouj1.s:4393: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/cc0Iouj1.s:4513: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/cc0Iouj1.s:4633: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/cc0Iouj1.s:4753: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/cc0Iouj1.s:4873: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/cc0Iouj1.s:4993: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/cc0Iouj1.s:5113: Error: no such instruction: `fisttpq -56(%ebp)' ! /tmp/cc0Iouj1.s:5233: Error: no such instruction: `fisttpq -56(%ebp)' make[5]: *** [insn_sse3.o] Error 1 |
|
From: Tom H. <th...@cy...> - 2007-02-27 03:18:51
|
Nightly build on lloyd ( x86_64, Fedora Core 3 ) started at 2007-02-27 03:05:05 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 == 288 tests, 6 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) memcheck/tests/xml1 (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) |
|
From: Tom H. <th...@cy...> - 2007-02-27 03:14:17
|
Nightly build on gill ( x86_64, Fedora Core 2 ) started at 2007-02-27 03:00:03 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 == 290 tests, 6 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/fdleak_fcntl (stderr) none/tests/mremap (stderr) none/tests/mremap2 (stdout) |
|
From: <js...@ac...> - 2007-02-27 01:17:22
|
Nightly build on g5 ( SuSE 10.1, ppc970 ) started at 2007-02-27 02:00:01 CET 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 == 225 tests, 6 stderr failures, 2 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) ================================================= == 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 == 225 tests, 6 stderr failures, 3 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/res_search (stdout) ================================================= == Difference between 24 hours ago and now == ================================================= *** old.short Tue Feb 27 02:09:04 2007 --- new.short Tue Feb 27 02:17:19 2007 *************** *** 8,10 **** ! == 225 tests, 6 stderr failures, 3 stdout failures, 0 posttest failures == memcheck/tests/deep_templates (stdout) --- 8,10 ---- ! == 225 tests, 6 stderr failures, 2 stdout failures, 0 posttest failures == memcheck/tests/deep_templates (stdout) *************** *** 17,19 **** none/tests/mremap2 (stdout) - none/tests/res_search (stdout) --- 17,18 ---- |