|
From: Tom H. <th...@cy...> - 2003-12-01 14:31:14
|
In message <Pin...@gr...>
Nicholas Nethercote <nj...@ca...> wrote:
> Ah. Should I back out the changes? In HEAD and stable branch?
Possibly. I'd be interested to know how the original submitter was
triggering the problem. Although RH9 does use gettid for certain
things I thought that it only did so when the TLS/NPTL version of
the C library was in use, and valgrind can't use that at the moment.
The main place that the C library seems to use it is raise() and
that also uses tkill() which he hasn't mentioned in the bug report.
Tom
--
Tom Hughes (th...@cy...)
Software Engineer, Cyberscience Corporation
http://www.cyberscience.com/
|
|
From: Jeremy F. <je...@go...> - 2003-12-02 10:36:01
|
On Mon, 2003-12-01 at 06:23, Nicholas Nethercote wrote: > Ah. Should I back out the changes? In HEAD and stable branch? Yeah, I think so. Without knowing the details of why this came up, the missing gettid is probably a symptom of some other problem. As Tom said, just calling gettid probably isn't producing any useful results, and there's no sensible way you can use the tid anyway. J |
|
From: Nicholas N. <nj...@ca...> - 2003-12-02 09:36:03
|
CVS commit by nethercote:
Backing out bogus support for gettid() I added yesterday.
M +0 -7 vg_syscalls.c 1.61
--- valgrind/coregrind/vg_syscalls.c #1.60:1.61
@@ -1937,10 +1937,4 @@ PRE(getpid)
}
-PRE(gettid)
-{
- /* pid_t gettid(void); */
- MAYBE_PRINTF("gettid ()\n");
-}
-
PRE(getpgid)
{
@@ -4642,5 +4636,4 @@ static const struct sys_info sys_info[]
SYSB_(getgid32, False),
SYSB_(getpid, False),
- SYSB_(gettid, False),
SYSB_(getpgid, False),
SYSB_(getpgrp, False),
|
|
From: Nicholas N. <nj...@ca...> - 2003-12-02 10:41:47
|
CVS commit by nethercote:
Grouped options in the usage message so they're a bit easier to understand.
M +23 -26 vg_main.c 1.127
--- valgrind/coregrind/vg_main.c #1.126:1.127
@@ -637,7 +637,6 @@ static void usage ( void )
"usage: valgrind [options] prog-and-args\n"
"\n"
-" core user options, with defaults in [ ], are:\n"
+" common user options for all Valgrind tools, with defaults in [ ]:\n"
" --tool=<name> Use the Valgrind tool named <name> [memcheck]\n"
-
" --help show this message\n"
" --version show version\n"
@@ -645,7 +643,20 @@ static void usage ( void )
" -q --quiet run silently; only print error msgs\n"
" -v --verbose be more verbose, incl counts of errors\n"
-
" --trace-children=no|yes Valgrind-ise child processes? [no]\n"
-
+" --track-fds=no|yes Track open file descriptors? [no]\n"
+"\n"
+" uncommon user options for all Valgrind tools:\n"
+" --run-libc-freeres=no|yes Free up glibc memory at exit? [yes]\n"
+" --weird-hacks=hack1,hack2,... [none]\n"
+" recognised hacks are: ioctl-VTIME truncate-writes lax-ioctls\n"
+" --signal-polltime=<time> time, in mS, we should poll for signals.\n"
+" Only applies for older kernels which need\n"
+" signal routing [50]\n"
+" --lowlat-signals=no|yes improve wake-up latency when a thread receives\n"
+" a signal [no]\n"
+" --lowlat-syscalls=no|yes improve wake-up latency when a thread's\n"
+" syscall completes [no]\n"
+"\n"
+" user options for Valgrind tools that report errors:\n"
" --logfile-fd=<number> file descriptor for messages [2=stderr]\n"
" --logfile=<file> log messages to <file>.pid<pid>\n"
@@ -659,27 +669,13 @@ static void usage ( void )
" --gen-suppressions=no|yes print suppressions for errors detected [no]\n"
-" --track-fds=no|yes Track open file descriptors? [no]\n"
-
" --gdb-attach=no|yes start GDB when errors detected? [no]\n"
" --gdb-path=/path/to/gdb path to the GDB to use [/usr/bin/gdb]\n"
" --input-fd=<number> file descriptor for (gdb) input [0=stdin]\n"
-
-" --run-libc-freeres=no|yes Free up glibc memory at exit? [yes]\n"
-" --weird-hacks=hack1,hack2,... [none]\n"
-" recognised hacks are: ioctl-VTIME truncate-writes lax-ioctls\n"
-" --signal-polltime=<time> time, in mS, we should poll for signals.\n"
-" Only applies for older kernels which need\n"
-" signal routing [50]\n"
-" --lowlat-signals=no|yes improve wake-up latency when a thread receives\n"
-" a signal [no]\n"
-" --lowlat-syscalls=no|yes improve wake-up latency when a thread's\n"
-" syscall completes [no]\n"
"\n"
-" %s tool user options:\n";
-
+" user options for %s:\n";
Char* usage2 =
"\n"
-" core options for debugging Valgrind itself are:\n"
+" debugging options for all Valgrind tools:\n"
" --sanity-level=<number> level of sanity checking to do [1]\n"
" --single-step=no|yes translate each instr separately? [no]\n"
@@ -695,10 +691,11 @@ static void usage ( void )
" --stop-after=<number> switch to real CPU after executing\n"
" <number> basic blocks [infinity]\n"
-" --dump-error=<number> show translation for basic block\n"
-" associated with <number>'th\n"
-" error context [0=don't show any]\n"
" --wait-for-gdb=yes|no pause on startup to wait for gdb attach\n"
"\n"
-" %s tool debugging options:\n";
+" debugging options for Valgrind tools that report errors\n"
+" --dump-error=<number> show translation for basic block associated\n"
+" with <number>'th error context [0=show none]\n"
+"\n"
+" debugging options for %s:\n";
Char* usage3 =
|
|
From: Dirk M. <mu...@kd...> - 2003-12-05 16:40:14
|
CVS commit by mueller:
allow absolute paths to be specified when "which" is not found.
CCMAIL: 691...@bu...
M +5 -1 valgrind.in 1.40
--- valgrind/coregrind/valgrind.in #1.39:1.40
@@ -110,5 +110,9 @@
# Ensure the program exists. Ignore any error messages from 'which'.
which_prog=`which $1 2> /dev/null`
- if [ z$which_prog = z ] ; then
+ if [ z$which_prog = z ] && (echo "$1" | grep -q '/'); then
+ which_prog=$1
+ fi
+
+ if [ z$which_prog = z ]; then
echo "$0: '$1' not found in \$PATH, aborting."
exit
|
|
From: Dirk M. <mu...@kd...> - 2003-12-07 23:36:44
|
CVS commit by mueller: in C, casting of lvalues is illegal. M +1 -1 vg_syscalls.c 1.63 --- valgrind/coregrind/vg_syscalls.c #1.62:1.63 @@ -816,5 +816,5 @@ static Bool fd_allowed(Int fd, const Cha #define SYSNO (tst->m_eax) /* in PRE(x) */ -#define res ((Int)tst->m_eax) /* in POST(x) */ +#define res (tst->m_eax) /* in POST(x) */ #define arg1 (tst->m_ebx) #define arg2 (tst->m_ecx) |
|
From: Jeremy F. <je...@go...> - 2003-12-08 21:59:14
|
CVS commit by fitzhardinge:
Patch from Tom Hughes: make --gdb-attach=yes work when a program is
killed by a fatal signal.
M +6 -1 vg_signals.c 1.52
--- valgrind/coregrind/vg_signals.c #1.51:1.52
@@ -1388,4 +1388,9 @@ static void vg_default_action(const vki_
}
+ if (VG_(is_action_requested)( "Attach to GDB", & VG_(clo_GDB_attach) )) {
+ ThreadState* tst = & VG_(threads)[ tid ];
+ VG_(swizzle_esp_then_start_GDB)( tst->m_eip, tst->m_esp, tst->m_ebp );
+ }
+
if (VG_(fatal_signal_set)) {
VG_(fatal_sigNo) = sigNo;
|
|
From: Julian S. <js...@ac...> - 2003-12-12 06:22:37
|
CVS commit by jseward:
Print "object doesn't have a %s" all on one line.
M +4 -2 vg_symtab2.c 1.61
--- valgrind/coregrind/vg_symtab2.c #1.60:1.61
@@ -677,6 +677,8 @@ void read_symtab( SegInfo* si, Char* tab
if (o_strtab == NULL || o_symtab == NULL) {
- VG_(symerr)("object doesn't have a ");
- VG_(symerr)(tab_name);
+ Char buf[80];
+ vg_assert(VG_(strlen)(tab_name) < 40);
+ VG_(sprintf)(buf, " object doesn't have a %s", tab_name);
+ VG_(symerr)(buf);
return;
}
|
|
From: Julian S. <js...@ac...> - 2003-12-12 06:40:35
|
CVS commit by jseward:
Reword warning message emitted by fd_allowed() to make it a little clearer.
M +6 -4 vg_syscalls.c 1.64
--- valgrind/coregrind/vg_syscalls.c #1.63:1.64
@@ -784,8 +784,10 @@ static Bool fd_allowed(Int fd, const Cha
{
if (fd < 0 || fd > VG_MAX_FD || fd == VG_(clo_logfile_fd)) {
- VG_(message)(Vg_UserMsg, "Warning: bad use of file descriptor %d in syscall %s()",
+ VG_(message)(Vg_UserMsg,
+ "Warning: invalid file descriptor %d in syscall %s()",
fd, syscall);
if (fd == VG_(clo_logfile_fd))
- VG_(message)(Vg_UserMsg, " Use --logfile-fd=<number> to select an alternative "
+ VG_(message)(Vg_UserMsg,
+ " Use --logfile-fd=<number> to select an alternative "
"logfile fd.");
if (VG_(clo_verbosity) > 1) {
|
|
From: Julian S. <js...@ac...> - 2003-12-13 23:16:58
|
CVS commit by jseward:
Patch in a DWARF1 (obsolete) line number reader, from the stable (2.0)
branch. Apparently the Lahey Fortran compiler emits DWARF1 line
number info.
M +299 -2 vg_dwarf.c 1.2
M +23 -7 vg_symtab2.c 1.62
M +10 -1 vg_symtab2.h 1.3
--- valgrind/coregrind/vg_dwarf.c #1.1:1.2
@@ -1,4 +1,4 @@
/*--------------------------------------------------------------------*/
-/*--- Read DWARF2 debug info. vg_symtab_dwarf.c ---*/
+/*--- Read DWARF2 debug info. vg_dwarf.c ---*/
/*--------------------------------------------------------------------*/
@@ -532,5 +532,302 @@ void VG_(read_debuginfo_dwarf2) ( SegInf
}
+
+/*------------------------------------------------------------*/
+/*--- Read DWARF1 format line number info. ---*/
+/*------------------------------------------------------------*/
+
+/* DWARF1 appears to be redundant, but nevertheless the Lahey Fortran
+ compiler generates it.
+*/
+
+/* The following three enums (dwarf_tag, dwarf_form, dwarf_attribute)
+ are taken from the file include/elf/dwarf.h in the GNU gdb-6.0
+ sources, which are Copyright 1992, 1993, 1995, 1999 Free Software
+ Foundation, Inc and naturally licensed under the GNU General Public
+ License version 2 or later.
+*/
+
+/* Tag names and codes. */
+
+enum dwarf_tag {
+ TAG_padding = 0x0000,
+ TAG_array_type = 0x0001,
+ TAG_class_type = 0x0002,
+ TAG_entry_point = 0x0003,
+ TAG_enumeration_type = 0x0004,
+ TAG_formal_parameter = 0x0005,
+ TAG_global_subroutine = 0x0006,
+ TAG_global_variable = 0x0007,
+ /* 0x0008 -- reserved */
+ /* 0x0009 -- reserved */
+ TAG_label = 0x000a,
+ TAG_lexical_block = 0x000b,
+ TAG_local_variable = 0x000c,
+ TAG_member = 0x000d,
+ /* 0x000e -- reserved */
+ TAG_pointer_type = 0x000f,
+ TAG_reference_type = 0x0010,
+ TAG_compile_unit = 0x0011,
+ TAG_string_type = 0x0012,
+ TAG_structure_type = 0x0013,
+ TAG_subroutine = 0x0014,
+ TAG_subroutine_type = 0x0015,
+ TAG_typedef = 0x0016,
+ TAG_union_type = 0x0017,
+ TAG_unspecified_parameters = 0x0018,
+ TAG_variant = 0x0019,
+ TAG_common_block = 0x001a,
+ TAG_common_inclusion = 0x001b,
+ TAG_inheritance = 0x001c,
+ TAG_inlined_subroutine = 0x001d,
+ TAG_module = 0x001e,
+ TAG_ptr_to_member_type = 0x001f,
+ TAG_set_type = 0x0020,
+ TAG_subrange_type = 0x0021,
+ TAG_with_stmt = 0x0022,
+
+ /* GNU extensions */
+
+ TAG_format_label = 0x8000, /* for FORTRAN 77 and Fortran 90 */
+ TAG_namelist = 0x8001, /* For Fortran 90 */
+ TAG_function_template = 0x8002, /* for C++ */
+ TAG_class_template = 0x8003 /* for C++ */
+};
+
+/* Form names and codes. */
+
+enum dwarf_form {
+ FORM_ADDR = 0x1,
+ FORM_REF = 0x2,
+ FORM_BLOCK2 = 0x3,
+ FORM_BLOCK4 = 0x4,
+ FORM_DATA2 = 0x5,
+ FORM_DATA4 = 0x6,
+ FORM_DATA8 = 0x7,
+ FORM_STRING = 0x8
+};
+
+/* Attribute names and codes. */
+
+enum dwarf_attribute {
+ AT_sibling = (0x0010|FORM_REF),
+ AT_location = (0x0020|FORM_BLOCK2),
+ AT_name = (0x0030|FORM_STRING),
+ AT_fund_type = (0x0050|FORM_DATA2),
+ AT_mod_fund_type = (0x0060|FORM_BLOCK2),
+ AT_user_def_type = (0x0070|FORM_REF),
+ AT_mod_u_d_type = (0x0080|FORM_BLOCK2),
+ AT_ordering = (0x0090|FORM_DATA2),
+ AT_subscr_data = (0x00a0|FORM_BLOCK2),
+ AT_byte_size = (0x00b0|FORM_DATA4),
+ AT_bit_offset = (0x00c0|FORM_DATA2),
+ AT_bit_size = (0x00d0|FORM_DATA4),
+ /* (0x00e0|FORM_xxxx) -- reserved */
+ AT_element_list = (0x00f0|FORM_BLOCK4),
+ AT_stmt_list = (0x0100|FORM_DATA4),
+ AT_low_pc = (0x0110|FORM_ADDR),
+ AT_high_pc = (0x0120|FORM_ADDR),
+ AT_language = (0x0130|FORM_DATA4),
+ AT_member = (0x0140|FORM_REF),
+ AT_discr = (0x0150|FORM_REF),
+ AT_discr_value = (0x0160|FORM_BLOCK2),
+ /* (0x0170|FORM_xxxx) -- reserved */
+ /* (0x0180|FORM_xxxx) -- reserved */
+ AT_string_length = (0x0190|FORM_BLOCK2),
+ AT_common_reference = (0x01a0|FORM_REF),
+ AT_comp_dir = (0x01b0|FORM_STRING),
+ AT_const_value_string = (0x01c0|FORM_STRING),
+ AT_const_value_data2 = (0x01c0|FORM_DATA2),
+ AT_const_value_data4 = (0x01c0|FORM_DATA4),
+ AT_const_value_data8 = (0x01c0|FORM_DATA8),
+ AT_const_value_block2 = (0x01c0|FORM_BLOCK2),
+ AT_const_value_block4 = (0x01c0|FORM_BLOCK4),
+ AT_containing_type = (0x01d0|FORM_REF),
+ AT_default_value_addr = (0x01e0|FORM_ADDR),
+ AT_default_value_data2 = (0x01e0|FORM_DATA2),
+ AT_default_value_data4 = (0x01e0|FORM_DATA4),
+ AT_default_value_data8 = (0x01e0|FORM_DATA8),
+ AT_default_value_string = (0x01e0|FORM_STRING),
+ AT_friends = (0x01f0|FORM_BLOCK2),
+ AT_inline = (0x0200|FORM_STRING),
+ AT_is_optional = (0x0210|FORM_STRING),
+ AT_lower_bound_ref = (0x0220|FORM_REF),
+ AT_lower_bound_data2 = (0x0220|FORM_DATA2),
+ AT_lower_bound_data4 = (0x0220|FORM_DATA4),
+ AT_lower_bound_data8 = (0x0220|FORM_DATA8),
+ AT_private = (0x0240|FORM_STRING),
+ AT_producer = (0x0250|FORM_STRING),
+ AT_program = (0x0230|FORM_STRING),
+ AT_protected = (0x0260|FORM_STRING),
+ AT_prototyped = (0x0270|FORM_STRING),
+ AT_public = (0x0280|FORM_STRING),
+ AT_pure_virtual = (0x0290|FORM_STRING),
+ AT_return_addr = (0x02a0|FORM_BLOCK2),
+ AT_abstract_origin = (0x02b0|FORM_REF),
+ AT_start_scope = (0x02c0|FORM_DATA4),
+ AT_stride_size = (0x02e0|FORM_DATA4),
+ AT_upper_bound_ref = (0x02f0|FORM_REF),
+ AT_upper_bound_data2 = (0x02f0|FORM_DATA2),
+ AT_upper_bound_data4 = (0x02f0|FORM_DATA4),
+ AT_upper_bound_data8 = (0x02f0|FORM_DATA8),
+ AT_virtual = (0x0300|FORM_STRING),
+
+ /* GNU extensions. */
+
+ AT_sf_names = (0x8000|FORM_DATA4),
+ AT_src_info = (0x8010|FORM_DATA4),
+ AT_mac_info = (0x8020|FORM_DATA4),
+ AT_src_coords = (0x8030|FORM_DATA4),
+ AT_body_begin = (0x8040|FORM_ADDR),
+ AT_body_end = (0x8050|FORM_ADDR)
+};
+
+/* end of enums taken from gdb-6.0 sources */
+
+void VG_(read_debuginfo_dwarf1) (
+ SegInfo* si,
+ UChar* dwarf1d, Int dwarf1d_sz,
+ UChar* dwarf1l, Int dwarf1l_sz )
+{
+ UInt stmt_list;
+ Bool stmt_list_found;
+ Int die_offset, die_szb, at_offset;
+ UShort die_kind, at_kind;
+ UChar* at_base;
+ UChar* src_filename;
+
+ if (0)
+ VG_(printf)("read_debuginfo_dwarf1 ( %p, %d, %p, %d )\n",
+ dwarf1d, dwarf1d_sz, dwarf1l, dwarf1l_sz );
+
+ /* This loop scans the DIEs. */
+ die_offset = 0;
+ while (True) {
+ if (die_offset >= dwarf1d_sz) break;
+
+ die_szb = *(Int*)(dwarf1d + die_offset);
+ die_kind = *(UShort*)(dwarf1d + die_offset + 4);
+
+ /* We're only interested in compile_unit DIEs; ignore others. */
+ if (die_kind != TAG_compile_unit) {
+ die_offset += die_szb;
+ continue;
+ }
+
+ if (0)
+ VG_(printf)("compile-unit DIE: offset %d, tag 0x%x, size %d\n",
+ die_offset, (Int)die_kind, die_szb );
+
+ /* We've got a compile_unit DIE starting at (dwarf1d +
+ die_offset+6). Try and find the AT_name and AT_stmt_list
+ attributes. Then, finally, we can read the line number info
+ for this source file. */
+
+ /* The next 3 are set as we find the relevant attrs. */
+ src_filename = NULL;
+ stmt_list_found = False;
+ stmt_list = 0;
+
+ /* This loop scans the Attrs inside compile_unit DIEs. */
+ at_base = dwarf1d + die_offset + 6;
+ at_offset = 0;
+ while (True) {
+ if (at_offset >= die_szb-6) break;
+
+ at_kind = *(UShort*)(at_base + at_offset);
+ if (0) VG_(printf)("atoffset %d, attag 0x%x\n",
+ at_offset, (Int)at_kind );
+ at_offset += 2; /* step over the attribute itself */
+ /* We have to examine the attribute to figure out its
+ length. */
+ switch (at_kind) {
+ case AT_stmt_list:
+ case AT_language:
+ case AT_sibling:
+ if (at_kind == AT_stmt_list) {
+ stmt_list_found = True;
+ stmt_list = *(Int*)(at_base+at_offset);
+ }
+ at_offset += 4; break;
+ case AT_high_pc:
+ case AT_low_pc:
+ at_offset += sizeof(void*); break;
+ case AT_name:
+ case AT_producer:
+ case AT_comp_dir:
+ /* Zero terminated string, step over it. */
+ if (at_kind == AT_name)
+ src_filename = at_base + at_offset;
+ while (at_offset < die_szb-6 && at_base[at_offset] != 0)
+ at_offset++;
+ at_offset++;
+ break;
+ default:
+ VG_(printf)("Unhandled DWARF-1 attribute 0x%x\n",
+ (Int)at_kind );
+ VG_(core_panic)("Unhandled DWARF-1 attribute");
+ } /* switch (at_kind) */
+ } /* looping over attributes */
+
+ /* So, did we find the required stuff for a line number table in
+ this DIE? If yes, read it. */
+ if (stmt_list_found /* there is a line number table */
+ && src_filename != NULL /* we know the source filename */
+ ) {
+ /* Table starts:
+ Length:
+ 4 bytes, includes the entire table
+ Base address:
+ unclear (4? 8?), assuming native pointer size here.
+ Then a sequence of triples
+ (source line number -- 32 bits
+ source line column -- 16 bits
+ address delta -- 32 bits)
+ */
+ Addr base;
+ Int len;
+ Char* curr_filenm;
+ UChar* ptr;
+ UInt prev_line, prev_delta;
+
+ curr_filenm = VG_(addStr) ( si, src_filename, -1 );
+ prev_line = prev_delta = 0;
+
+ ptr = dwarf1l + stmt_list;
+ len = *(Int*)ptr; ptr += sizeof(Int);
+ base = (Addr)(*(void**)ptr); ptr += sizeof(void*);
+ len -= (sizeof(Int) + sizeof(void*));
+ while (len > 0) {
+ UInt line;
+ UShort col;
+ UInt delta;
+ line = *(UInt*)ptr; ptr += sizeof(UInt);
+ col = *(UShort*)ptr; ptr += sizeof(UShort);
+ delta = *(UShort*)ptr; ptr += sizeof(UInt);
+ if (0) VG_(printf)("line %d, col %d, delta %d\n",
+ line, (Int)col, delta );
+ len -= (sizeof(UInt) + sizeof(UShort) + sizeof(UInt));
+
+ if (delta > 0 && prev_line > 0) {
+ if (0) VG_(printf) (" %d %d-%d\n",
+ prev_line, prev_delta, delta-1);
+ VG_(addLineInfo) ( si, curr_filenm,
+ base + prev_delta, base + delta,
+ prev_line, 0 );
+ }
+ prev_line = line;
+ prev_delta = delta;
+ }
+ }
+
+ /* Move on the the next DIE. */
+ die_offset += die_szb;
+
+ } /* Looping over DIEs */
+
+}
+
+
/*--------------------------------------------------------------------*/
-/*--- end vg_symtab_dwarf.c ---*/
+/*--- end vg_dwarf.c ---*/
/*--------------------------------------------------------------------*/
--- valgrind/coregrind/vg_symtab2.c #1.61:1.62
@@ -969,4 +969,6 @@ Bool vg_read_lib_symbols ( SegInfo* si )
UChar* stabstr = NULL; /* .stabstr (stabs) */
UChar* debug_line = NULL; /* .debug_line (dwarf2) */
+ UChar* dwarf1d = NULL; /* .debug (dwarf1) */
+ UChar* dwarf1l = NULL; /* .line (dwarf1) */
/* Section sizes, in bytes */
@@ -978,8 +980,12 @@ Bool vg_read_lib_symbols ( SegInfo* si )
UInt stabstr_sz = 0;
UInt debug_line_sz = 0;
+ UInt dwarf1d_sz = 0;
+ UInt dwarf1l_sz = 0;
+
+ Bool has_debuginfo = False;
/* Find all interesting sections */
for (i = 0; i < ehdr->e_shnum; i++) {
- #define FIND(sec_name, sec_data, sec_size, in_exec, type) \
+# define FIND(sec_name, sec_data, sec_size, in_exec, type) \
if (0 == VG_(strcmp)(sec_name, sh_strtab + shdr[i].sh_name)) { \
if (0 != sec_data) \
@@ -1008,9 +1014,11 @@ Bool vg_read_lib_symbols ( SegInfo* si )
else FIND(".stabstr", stabstr, stabstr_sz, 0, UChar*)
else FIND(".debug_line", debug_line, debug_line_sz, 0, UChar*)
+ else FIND(".debug", dwarf1d, dwarf1d_sz, 0, UChar*)
+ else FIND(".line", dwarf1l, dwarf1l_sz, 0, UChar*)
else FIND(".got", si->got_start, si->got_size, 1, Addr)
else FIND(".plt", si->plt_start, si->plt_size, 1, Addr)
- #undef FIND
+# undef FIND
/* Check some sizes */
@@ -1029,10 +1037,18 @@ Bool vg_read_lib_symbols ( SegInfo* si )
/* Read the stabs and/or dwarf2 debug information, if any. */
if (stab != NULL && stabstr != NULL) {
- VG_(read_debuginfo_stabs) ( si, stab, stab_sz, stabstr, stabstr_sz );
-
- } else if (debug_line) {
+ has_debuginfo = True;
+ VG_(read_debuginfo_stabs) ( si, stab, stab_sz,
+ stabstr, stabstr_sz );
+ }
+ if (debug_line) {
+ has_debuginfo = True;
VG_(read_debuginfo_dwarf2) ( si, debug_line, debug_line_sz );
-
- } else {
+ }
+ if (dwarf1d && dwarf1l) {
+ has_debuginfo = True;
+ VG_(read_debuginfo_dwarf1) ( si, dwarf1d, dwarf1d_sz,
+ dwarf1l, dwarf1l_sz );
+ }
+ if (!has_debuginfo) {
VG_(symerr)(" object doesn't have any debug info");
goto out;
--- valgrind/coregrind/vg_symtab2.h #1.2:1.3
@@ -186,5 +186,14 @@ void VG_(read_debuginfo_stabs) ( SegInfo
DWARF2 reader
-------------------- */
-void VG_(read_debuginfo_dwarf2) ( SegInfo* si, UChar* dwarf2, Int dwarf2_sz );
+void VG_(read_debuginfo_dwarf2) ( SegInfo* si,
+ UChar* dwarf2, Int dwarf2_sz );
+
+/* --------------------
+ DWARF1 reader
+ -------------------- */
+void VG_(read_debuginfo_dwarf1) ( SegInfo* si,
+ UChar* dwarf1d, Int dwarf1d_sz,
+ UChar* dwarf1l, Int dwarf1l_sz );
+
#endif /* _VG_SYMTYPE_H */
|
|
From: Julian S. <js...@ac...> - 2003-12-14 14:25:54
|
CVS commit by jseward:
Increase the max size of the translation cache from 200k average bbs to
300k average bbs. Programs on the size of OOo (680m17) are thrashing the
cache at the smaller size, creating large numbers of retranslations and
wasting significant time as a result.
M +2 -2 vg_transtab.c 1.25
--- valgrind/coregrind/vg_transtab.c #1.24:1.25
@@ -50,5 +50,5 @@ static /* const */ Int vg_tc_sector_szB
/* Number of entries in the translation table. This must be a prime
number in order to make the hashing work properly. */
-#define VG_TT_SIZE /*5281*/ /*100129*/ 200191 /*250829*/
+#define VG_TT_SIZE /*5281*/ /*100129*/ /*200191*/ /*250829*/ 300007
/* Do an LRU pass when the translation table becomes this full. */
@@ -652,5 +652,5 @@ void VG_(init_tt_tc) ( void )
/* Ensure the calculated value is not way crazy. */
vg_assert(vg_tc_sector_szB >= 200000);
- vg_assert(vg_tc_sector_szB <= 6000000);
+ vg_assert(vg_tc_sector_szB <= 8000000);
for (s = 0; s < VG_TC_N_SECTORS; s++) {
|
|
From: Dirk M. <mu...@kd...> - 2003-12-15 15:24:12
|
CVS commit by mueller:
patch by Jim Meyering: redirect error output to stderr, and exit with nonzero
exit code upon failure.
M +18 -18 valgrind.in 1.41
--- valgrind/coregrind/valgrind.in #1.40:1.41
@@ -80,10 +80,10 @@
tool_so="vgskin_${tool}.so"
if [ ! -r "$tooldir/$tool_so" ] ; then
- echo
- echo "Tool error:"
- echo " The shared library \`$tool_so' for the chosen"
- echo " tool \`$tool' could not be found in"
- echo " $tooldir"
- echo
+ echo >&2
+ echo "Tool error:" >&2
+ echo " The shared library \`$tool_so' for the chosen" >&2
+ echo " tool \`$tool' could not be found in" >&2
+ echo " $tooldir" >&2
+ echo >&2
exit 1
fi
@@ -115,6 +115,6 @@
if [ z$which_prog = z ]; then
- echo "$0: '$1' not found in \$PATH, aborting."
- exit
+ echo "$0: '$1' not found in \$PATH, aborting." >&2
+ exit 1
fi
@@ -123,17 +123,17 @@
# Ensure the program isn't statically linked.
*"statically linked"*)
- echo "\`$which_prog' is statically linked"
- echo "Valgrind only works on dynamically linked executables; your"
- echo "program must rely on at least one shared object for Valgrind"
- echo "to work with it. Read FAQ #5 for more information."
+ echo "\`$which_prog' is statically linked" >&2
+ echo "Valgrind only works on dynamically linked executables; your" >&2
+ echo "program must rely on at least one shared object for Valgrind" >&2
+ echo "to work with it. Read FAQ #5 for more information." >&2
exit 1 ;;
# Ensure that there are no setuid or gid flags
*:\ set?id\ ELF*)
- echo "\`$which_prog' is suid/sgid."
- echo "Valgrind can't handle these executables, as it"
- echo "requires the LD_PRELOAD feature in order to work."
- echo ""
- echo "Remove those flags and try again."
- echo ""
+ echo "\`$which_prog' is suid/sgid." >&2
+ echo "Valgrind can't handle these executables, as it" >&2
+ echo "requires the LD_PRELOAD feature in order to work." >&2
+ echo "" >&2
+ echo "Remove those flags and try again." >&2
+ echo "" >&2
exit 1
;;
|
|
From: Jeremy F. <je...@go...> - 2003-12-15 23:32:51
|
CVS commit by fitzhardinge:
Make symbol prefix matching table driver, and be a bit more careful
about overrunning the ends of names.
M +34 -15 vg_symtab2.c 1.64
--- valgrind/coregrind/vg_symtab2.c #1.63:1.64
@@ -408,28 +408,47 @@ static RiSym *prefersym(RiSym *a, RiSym
{
Int pfx;
+ Int lena, lenb;
+ Int i;
+ static const struct {
+ const Char *prefix;
+ Int len;
+ } prefixes[] = {
+#define PFX(x) { x, sizeof(x)-1 }
+ /* order from longest to shortest */
+ PFX("__GI___libc_"),
+ PFX("__GI___"),
+ PFX("__libc_"),
+ PFX("__GI__"),
+ PFX("__GI_"),
+ PFX("__"),
+#undef PFX
+ };
+
+ lena = VG_(strlen)(a->name);
+ lenb = VG_(strlen)(b->name);
/* rearrange so that a is the long one */
- if (VG_(strlen)(a->name) < VG_(strlen)(b->name)) {
+ if (lena < lenb) {
RiSym *t;
+ Int lt;
t = a;
a = b;
b = t;
+
+ lt = lena;
+ lena = lenb;
+ lenb = lt;
}
- pfx = 0;
+ for(i = pfx = 0; i < sizeof(prefixes)/sizeof(*prefixes); i++) {
+ Int pfxlen = prefixes[i].len;
- if (VG_(memcmp)(a->name, "__GI___libc_", 12) == 0)
- pfx = 12;
- else if (VG_(memcmp)(a->name, "__libc_", 7) == 0)
- pfx = 7;
- else if (VG_(memcmp)(a->name, "__GI___", 7) == 0)
- pfx = 7;
- else if (VG_(memcmp)(a->name, "__GI__", 6) == 0)
- pfx = 6;
- else if (VG_(memcmp)(a->name, "__GI_", 5) == 0)
- pfx = 5;
- else if (VG_(memcmp)(a->name, "__", 2) == 0)
- pfx = 2;
+ if (pfxlen < lena &&
+ VG_(memcmp)(a->name, prefixes[i].prefix, pfxlen) == 0) {
+ pfx = pfxlen;
+ break;
+ }
+ }
if (pfx != 0 && VG_(strcmp)(a->name + pfx, b->name) == 0)
|
|
From: Jeremy F. <je...@go...> - 2003-12-16 01:49:27
|
CVS commit by fitzhardinge:
Change the --track-fds code to use VG_AR_CORE rather than
VG_(malloc)/(strdup), which puts things into VG_AR_SKIN.
M +9 -2 vg_mylibc.c 1.59
M +7 -7 vg_syscalls.c 1.66
--- valgrind/coregrind/vg_mylibc.c #1.58:1.59
@@ -969,6 +969,13 @@ __inline__ Char* VG_(arena_strdup) ( Are
{
Int i;
- Int len = VG_(strlen)(s) + 1;
- Char* res = VG_(arena_malloc) (aid, len);
+ Int len;
+ Char* res;
+
+ if (s == NULL)
+ return NULL;
+
+ len = VG_(strlen)(s) + 1;
+ res = VG_(arena_malloc) (aid, len);
+
for (i = 0; i < len; i++)
res[i] = s[i];
--- valgrind/coregrind/vg_syscalls.c #1.65:1.66
@@ -292,5 +292,5 @@ Char *resolve_fname(Int fd)
return NULL;
- return ((buf[0] == '/') ? VG_(strdup)(buf) : NULL);
+ return ((buf[0] == '/') ? VG_(arena_strdup)(VG_AR_CORE, buf) : NULL);
}
@@ -312,6 +312,6 @@ void record_fd_close(Int tid, Int fd)
i->next->prev = i->prev;
if(i->pathname)
- VG_(free) (i->pathname);
- VG_(free) (i);
+ VG_(arena_free) (VG_AR_CORE, i->pathname);
+ VG_(arena_free) (VG_AR_CORE, i);
fd_count--;
break;
@@ -340,5 +340,5 @@ void record_fd_open(Int tid, Int fd, cha
while (i) {
if (i->fd == fd) {
- if (i->pathname) VG_(free)(i->pathname);
+ if (i->pathname) VG_(arena_free)(VG_AR_CORE, i->pathname);
break;
}
@@ -348,5 +348,5 @@ void record_fd_open(Int tid, Int fd, cha
/* Not already one: allocate an OpenFd */
if (i == NULL) {
- i = VG_(malloc)(sizeof(OpenFd));
+ i = VG_(arena_malloc)(VG_AR_CORE, sizeof(OpenFd));
i->prev = NULL;
@@ -3351,5 +3351,5 @@ POST(open)
} else {
if(VG_(clo_track_fds))
- record_fd_open(tid, res, VG_(strdup)((Char*)arg1));
+ record_fd_open(tid, res, VG_(arena_strdup)(VG_AR_CORE, (Char*)arg1));
}
MAYBE_PRINTF("%d\n",res);
@@ -3395,5 +3395,5 @@ POST(creat)
} else {
if(VG_(clo_track_fds))
- record_fd_open(tid, res, VG_(strdup)((Char*)arg1));
+ record_fd_open(tid, res, VG_(arena_strdup)(VG_AR_CORE, (Char*)arg1));
}
MAYBE_PRINTF("%d\n",res);
|
|
From: Jeremy F. <je...@go...> - 2003-12-16 02:24:01
|
CVS commit by fitzhardinge: Remove coregrind/vg_valgrinq_dummy.c R vg_valgrinq_dummy.c 1.5 |
|
From: Jeremy F. <je...@go...> - 2003-12-18 07:23:17
|
CVS commit by fitzhardinge:
Fix a bug in the last VG_(max_fd) change; VG_(safe_fd) doesn't work before
VG_(max_fd) has been set up.
M +6 -6 vg_main.c 1.132
M +2 -0 vg_mylibc.c 1.62
--- valgrind/coregrind/vg_main.c #1.131:1.132
@@ -155,5 +155,5 @@ Int VG_(main_pgrp);
/* Maximum allowed application-visible file descriptor */
-Int VG_(max_fd);
+Int VG_(max_fd) = -1;
/* Words. */
@@ -1404,9 +1404,4 @@ void VG_(main) ( const KickstartParams *
vg_assert(VG_(clstk_end) == VG_(client_end));
- if (kp->vgexecfd != -1)
- VG_(vgexecfd) = VG_(safe_fd)(kp->vgexecfd);
- if (kp->clexecfd != -1)
- VG_(clexecfd) = VG_(safe_fd)(kp->clexecfd);
-
if (0) {
if (VG_(have_ssestate))
@@ -1438,4 +1433,9 @@ void VG_(main) ( const KickstartParams *
VG_(setrlimit)(VKI_RLIMIT_NOFILE, &rl);
+ if (kp->vgexecfd != -1)
+ VG_(vgexecfd) = VG_(safe_fd)(kp->vgexecfd);
+ if (kp->clexecfd != -1)
+ VG_(clexecfd) = VG_(safe_fd)(kp->clexecfd);
+
/* Read /proc/self/maps into a buffer. Must be before:
- SK_(pre_clo_init)(): so that if it calls VG_(malloc)(), any mmap'd
--- valgrind/coregrind/vg_mylibc.c #1.61:1.62
@@ -1204,4 +1204,6 @@ Int VG_(safe_fd)(Int oldfd)
Int newfd;
+ vg_assert(VG_(max_fd) != -1);
+
newfd = VG_(fcntl)(oldfd, VKI_F_DUPFD, VG_(max_fd)+1);
if (newfd != -1)
|
|
From: Jeremy F. <je...@go...> - 2003-12-19 00:24:24
|
CVS commit by fitzhardinge:
VG_(clo_pointercheck) is a Bool, which is a byte.
M +4 -4 vg_dispatch.S 1.14
--- valgrind/coregrind/vg_dispatch.S #1.13:1.14
@@ -78,6 +78,6 @@
/* check to see if we're doing pointer checking */
- movl VG_(clo_pointercheck), %eax
- testl %eax,%eax
+ movb VG_(clo_pointercheck), %al
+ testb %al,%al
jz 1f
@@ -148,6 +148,6 @@
run_innerloop_exit:
- movl VG_(clo_pointercheck), %ebx
- testl %ebx,%ebx
+ movb VG_(clo_pointercheck), %bl
+ testb %bl,%bl
jz 1f
|
|
From: Jeremy F. <je...@go...> - 2003-12-19 00:35:53
|
CVS commit by fitzhardinge:
Also remove vgpreload_*.so from LD_PRELOAD when we're not tracing
children.
M +3 -0 vg_syscalls.c 1.71
--- valgrind/coregrind/vg_syscalls.c #1.70:1.71
@@ -1690,4 +1690,7 @@ PRE(execve)
VG_(mash_colon_env)(ld_preload_str, buf);
+ VG_(sprintf)(buf, "%s*/vgpreload_*.so", VG_(libdir));
+ VG_(mash_colon_env)(ld_preload_str, buf);
+
VG_(sprintf)(buf, "%s*", VG_(libdir));
VG_(mash_colon_env)(ld_library_path_str, buf);
|
|
From: Jeremy F. <je...@go...> - 2003-12-19 17:18:34
|
CVS commit by fitzhardinge:
Make --trace-codegen start printing from the first basic block, rather
than the second.
M +1 -1 vg_translate.c 1.65
--- valgrind/coregrind/vg_translate.c #1.64:1.65
@@ -2387,5 +2387,5 @@ void VG_(translate) ( /*IN*/ ThreadId t
before --trace-codegen= style printing takes effect. */
notrace_until_done
- = VG_(overall_in_count) > notrace_until_limit;
+ = VG_(overall_in_count) >= notrace_until_limit;
seg = VG_(find_segment)(orig_addr);
|
|
From: Jeremy F. <je...@go...> - 2003-12-19 23:48:02
|
CVS commit by fitzhardinge:
Don't print prediction info for branches if we're not generating it.
M +3 -0 vg_from_ucode.c 1.70
--- valgrind/coregrind/vg_from_ucode.c #1.69:1.70
@@ -93,4 +93,7 @@ static JumpPred static_pred(Condcode con
static const Char *predstr(JumpPred p)
{
+ if (!VG_(clo_branchpred))
+ return "";
+
switch(p) {
default:
|
|
From: Jeremy F. <je...@go...> - 2003-12-20 18:20:23
|
CVS commit by fitzhardinge:
Fix typo in VG_(munmap)() error checking, which made it never remove
any Segment mappings.
M +1 -1 vg_mylibc.c 1.63
--- valgrind/coregrind/vg_mylibc.c #1.62:1.63
@@ -307,5 +307,5 @@ Int VG_(munmap)( void* start, Int length
{
Int res = VG_(do_syscall)(__NR_munmap, (UInt)start, (UInt)length );
- if (!VG_(is_kerror))
+ if (!VG_(is_kerror)(res))
VG_(unmap_range)((Addr)start, length);
return VG_(is_kerror)(res) ? -1 : 0;
|
|
From: Julian S. <js...@ac...> - 2003-12-21 23:33:13
|
CVS commit by jseward:
Make the debug printing in the symbol redirect machinery, easier to
understand.
M +22 -13 vg_symtab2.c 1.66
--- valgrind/coregrind/vg_symtab2.c #1.65:1.66
@@ -1912,4 +1912,8 @@ void VG_(mini_stack_dump) ( Addr eips[],
/*------------------------------------------------------------*/
+/* Set to True for debug printing. */
+static const Bool verbose_redir = False;
+
+
/* resolved redirections, indexed by from_addr */
typedef struct _CodeRedirect {
@@ -1986,5 +1990,4 @@ static Bool resolve_redir(CodeRedirect *
{
Bool resolved;
- static const Bool verbose = False;
vg_assert(si != NULL);
@@ -1997,6 +2000,6 @@ static Bool resolve_redir(CodeRedirect *
resolved = (redir->from_addr != 0) && (redir->to_addr != 0);
- if (verbose)
- VG_(printf)("trying to resolve %s:%s / %s:%s against %s:%s\n",
+ if (0 && verbose_redir)
+ VG_(printf)(" consider FROM binding %s:%s -> %s:%s in %s(%s)\n",
redir->from_lib, redir->from_sym,
redir->to_lib, redir->to_sym,
@@ -2010,7 +2013,7 @@ static Bool resolve_redir(CodeRedirect *
if (match_lib(redir->from_lib, si)) {
redir->from_addr = reverse_search_one_symtab(si, redir->from_sym);
- if (verbose)
- VG_(printf)("match lib %s passed; from_addr=%p\n",
- redir->from_lib, redir->from_addr);
+ if (verbose_redir && redir->from_addr != 0)
+ VG_(printf)(" bind FROM: %p = %s:%s\n",
+ redir->from_addr,redir->from_lib, redir->from_sym );
}
}
@@ -2021,7 +2024,8 @@ static Bool resolve_redir(CodeRedirect *
if (match_lib(redir->to_lib, si)) {
redir->to_addr = reverse_search_one_symtab(si, redir->to_sym);
- if (verbose)
- VG_(printf)("match lib %s passed; to_addr=%p\n",
- redir->to_lib, redir->to_addr);
+ if (verbose_redir && redir->to_addr != 0)
+ VG_(printf)(" bind TO: %p = %s:%s\n",
+ redir->to_addr,redir->to_lib, redir->to_sym );
+
}
}
@@ -2029,5 +2033,5 @@ static Bool resolve_redir(CodeRedirect *
resolved = (redir->from_addr != 0) && (redir->to_addr != 0);
- if (verbose)
+ if (0 && verbose_redir)
VG_(printf)("resolve_redir: %s:%s from=%p %s:%s to=%p\n",
redir->from_lib, redir->from_sym, redir->from_addr,
@@ -2035,6 +2039,6 @@ static Bool resolve_redir(CodeRedirect *
if (resolved) {
- if (VG_(clo_verbosity) > 2 || verbose) {
- VG_(message)(Vg_DebugMsg, "redir resolved (%s:%s=%p -> ",
+ if (VG_(clo_verbosity) > 2 || verbose_redir) {
+ VG_(message)(Vg_DebugMsg, " redir resolved (%s:%s=%p -> ",
redir->from_lib, redir->from_sym, redir->from_addr);
VG_(message)(Vg_DebugMsg, " %s:%s=%p)",
@@ -2061,4 +2065,8 @@ static void resolve_seg_redirs(SegInfo *
CodeRedirect *redir, *next;
+ if (verbose_redir)
+ VG_(printf)("Considering redirs to/from %s(soname=%s)\n",
+ si->filename, si->soname);
+
/* visit each unresolved redir - if it becomes resolved, then
remove it from the unresolved list */
|
|
From: Julian S. <js...@ac...> - 2003-12-21 23:55:29
|
CVS commit by jseward:
Use the redir machinery to forcibly remap stpcpy in libc.so.6 to our
own version in mac_replace_strmem.c. We have to do this the hard way
because overenthusiastic PLT bypassing in glibc means the usual
symbol-override stuff doesn't work. IOW, for the usual reason that we
have to use the redir machinery at all.
This makes many programs run much more quietly on SuSE 9.
M +11 -5 vg_symtab2.c 1.67
--- valgrind/coregrind/vg_symtab2.c #1.66:1.67
@@ -2107,4 +2107,9 @@ void VG_(add_redirect_sym)(const Char *f
redir->to_addr = 0;
+ if (VG_(clo_verbosity) >= 2)
+ VG_(message)(Vg_UserMsg,
+ "REDIRECT %s(%s) to %s(%s)",
+ from_lib, from_sym, to_lib, to_sym);
+
if (!resolve_redir_allsegs(redir)) {
/* can't resolve immediately; add to list */
@@ -2164,11 +2169,12 @@ void VG_(setup_code_redirect_table) ( vo
VG_(add_redirect_sym)("soname:libc.so.6", redirects[i].from,
"soname:libpthread.so.0", redirects[i].to);
-
- if (VG_(clo_verbosity) >= 2)
- VG_(message)(Vg_UserMsg,
- "REPLACING libc(%s) with libpthread(%s)",
- redirects[i].from, redirects[i].to);
}
+ /* Overenthusiastic use of PLT bypassing by the glibc people also
+ means we need to patch the following functions to our own
+ implementations of said, in mac_replace_strmem.c.
+ */
+ VG_(add_redirect_sym)("soname:libc.so.6", "stpcpy",
+ "*vgpreload_memcheck.so*", "stpcpy");
}
|
|
From: Julian S. <js...@ac...> - 2003-12-22 00:15:21
|
CVS commit by jseward:
For whatever reason, ld-2.3.2.so (ld-linux.so.2) seems to have its own
PLT-bypassed versions of stpcpy and strchr. Subvert them.
M +5 -0 vg_symtab2.c 1.68
--- valgrind/coregrind/vg_symtab2.c #1.67:1.68
@@ -2177,4 +2177,9 @@ void VG_(setup_code_redirect_table) ( vo
VG_(add_redirect_sym)("soname:libc.so.6", "stpcpy",
"*vgpreload_memcheck.so*", "stpcpy");
+
+ VG_(add_redirect_sym)("soname:ld-linux.so.2", "stpcpy",
+ "*vgpreload_memcheck.so*", "stpcpy");
+ VG_(add_redirect_sym)("soname:ld-linux.so.2", "strchr",
+ "*vgpreload_memcheck.so*", "strchr");
}
|
|
From: Julian S. <js...@ac...> - 2003-12-22 00:51:26
|
CVS commit by jseward:
resolve_redir(): when a redirect is resolved, if the source has
already been translated, discard that translation. Otherwise the
redirect will never take effect.
M +27 -3 vg_symtab2.c 1.69
--- valgrind/coregrind/vg_symtab2.c #1.68:1.69
@@ -2046,7 +2046,31 @@ static Bool resolve_redir(CodeRedirect *
}
- if (VG_(search_transtab)(redir->from_addr) != 0)
- VG_(message)(Vg_DebugMsg, "!!!! adding redirect to already called function %s (%p -> %p)!!!",
- redir->from_sym, redir->from_addr, redir->to_addr);
+ if (VG_(search_transtab)(redir->from_addr) != 0) {
+ /* For some given (from, to) redir, the "from" function got
+ called before the .so containing "to" became available. We
+ know this because there is already a translation for the
+ entry point of the original "from". So the redirect will
+ never actually take effect unless that translation is
+ discarded.
+
+ Note, we only really need to discard the first bb of the
+ old entry point, and so we avoid the problem of having to
+ figure out how big that bb was -- since it is at least 1
+ byte of original code, we can just pass 1 as the original
+ size to invalidate_translations() and it will indeed get
+ rid of the translation.
+
+ Note, this is potentially expensive -- discarding
+ translations causes complete unchaining.
+ */
+ if (VG_(clo_verbosity) > 2) {
+ VG_(message)(Vg_UserMsg,
+ "Discarding translation due to redirect of already called function" );
+ VG_(message)(Vg_UserMsg,
+ " %s (%p -> %p)",
+ redir->from_sym, redir->from_addr, redir->to_addr );
+ }
+ VG_(invalidate_translations)(redir->from_addr, 1, True);
+ }
VG_(SkipList_Insert)(&sk_resolved_redir, redir);
|