]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Merge patch from JeremyF:
authorJulian Seward <jseward@acm.org>
Wed, 13 Nov 2002 22:06:35 +0000 (22:06 +0000)
committerJulian Seward <jseward@acm.org>
Wed, 13 Nov 2002 22:06:35 +0000 (22:06 +0000)
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

coregrind/vg_mylibc.c
coregrind/vg_symtab2.c

index c8d2642fdc0c2a596815d3f73e228ab16ad8e2e0..60f969fe2696f97eb921d7d04bbfaa7c28055b15 100644 (file)
@@ -662,21 +662,18 @@ UInt VG_(printf) ( const char *format, ... )
 
 
 /* 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);
 
index c1619ec73ff8fbc83b842b384a7ffbfc4b24278e..6283fad08320608174d488062ae75ca499c96676 100644 (file)
@@ -2085,10 +2085,12 @@ static void search_all_loctabs ( Addr ptr, /*OUT*/SegInfo** psi,
    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 @@ Bool get_fnname ( Bool demangle, Addr a, Char* buf, Int nbuf,
       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 get_fnname ( Bool demangle, Addr a, Char* buf, Int nbuf,
 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) ( Addr a, Char* buf, Int nbuf )
 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 @@ void VG_(mini_stack_dump) ( ExeContext* ec )
    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,