Merge patch from JeremyF:
24-sym-offset
When looking up a symbol, also attach an offset. Also changes to make
sprintf reentrant.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@1299 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/vg_mylibc.c b/coregrind/vg_mylibc.c
index c8d2642..60f969f 100644
--- a/coregrind/vg_mylibc.c
+++ b/coregrind/vg_mylibc.c
@@ -662,21 +662,18 @@
/* A general replacement for sprintf(). */
-static Char* vg_sprintf_ptr;
-
-static void add_to_vg_sprintf_buf ( Char c )
-{
- *vg_sprintf_ptr++ = c;
-}
-
UInt VG_(sprintf) ( Char* buf, Char *format, ... )
{
UInt ret;
-
va_list vargs;
+ Char *ptr = buf;
+ static void add_to_vg_sprintf_buf ( Char c )
+ {
+ *ptr++ = c;
+ }
+
va_start(vargs,format);
- vg_sprintf_ptr = buf;
ret = VG_(vprintf) ( add_to_vg_sprintf_buf, format, vargs );
add_to_vg_sprintf_buf(0);
diff --git a/coregrind/vg_symtab2.c b/coregrind/vg_symtab2.c
index c1619ec..6283fad 100644
--- a/coregrind/vg_symtab2.c
+++ b/coregrind/vg_symtab2.c
@@ -2085,10 +2085,12 @@
call has come from vg_what_fn_or_object_is_this. */
static
Bool get_fnname ( Bool demangle, Addr a, Char* buf, Int nbuf,
- Bool match_anywhere_in_fun )
+ Bool match_anywhere_in_fun, Bool show_offset)
{
SegInfo* si;
Int sno;
+ Int offset;
+
search_all_symtabs ( a, &si, &sno, match_anywhere_in_fun );
if (si == NULL)
return False;
@@ -2098,6 +2100,25 @@
VG_(strncpy_safely)
( buf, & si->strtab[si->symtab[sno].nmoff], nbuf );
}
+
+ offset = a - si->symtab[sno].addr;
+ if (show_offset && offset != 0) {
+ Char buf2[12];
+ Char* symend = buf + VG_(strlen)(buf);
+ Char* end = buf + nbuf;
+ Int len;
+
+ len = VG_(sprintf)(buf2, "%c%d",
+ offset < 0 ? '-' : '+',
+ offset < 0 ? -offset : offset);
+ vg_assert(len < sizeof(buf2));
+
+ if (len < (end - symend)) {
+ Char *cp = buf2;
+ VG_(memcpy)(symend, cp, len+1);
+ }
+ }
+
return True;
}
@@ -2105,7 +2126,7 @@
Bool VG_(get_fnname) ( Addr a, Char* buf, Int nbuf )
{
return get_fnname ( /*demangle*/True, a, buf, nbuf,
- /*match_anywhere_in_fun*/True );
+ /*match_anywhere_in_fun*/True, True );
}
/* This is available to skins... always demangle C++ names,
@@ -2113,14 +2134,14 @@
Bool VG_(get_fnname_if_entry) ( Addr a, Char* buf, Int nbuf )
{
return get_fnname ( /*demangle*/True, a, buf, nbuf,
- /*match_anywhere_in_fun*/False );
+ /*match_anywhere_in_fun*/False, False );
}
/* This is only available to core... don't demangle C++ names */
Bool VG_(get_fnname_nodemangle) ( Addr a, Char* buf, Int nbuf )
{
return get_fnname ( /*demangle*/False, a, buf, nbuf,
- /*match_anywhere_in_fun*/True );
+ /*match_anywhere_in_fun*/True, False );
}
/* Map a code address to the name of a shared object file or the executable.
@@ -2217,7 +2238,7 @@
i = 0;
do {
n = 0;
- know_fnname = VG_(get_fnname) (ec->eips[i], buf_fn, M_VG_ERRTXT);
+ know_fnname = get_fnname (True, ec->eips[i], buf_fn, M_VG_ERRTXT, True, False);
know_objname = VG_(get_objname)(ec->eips[i], buf_obj, M_VG_ERRTXT);
know_srcloc = VG_(get_filename_linenum)(ec->eips[i],
buf_srcloc, M_VG_ERRTXT,