/*show offset?*/False );
}
+/* This is only available to core... don't demangle C++ names, but do
+ do Z-demangling, match anywhere in function, and don't show
+ offsets. */
+Bool VG_(get_fnname_Z_demangle_only) ( Addr a, Char* buf, Int nbuf )
+{
+# define N_TMPBUF 4096 /* arbitrary, 4096 == ERRTXT_LEN */
+ Char tmpbuf[N_TMPBUF];
+ Bool ok;
+ vg_assert(nbuf > 0);
+ ok = get_fnname ( /*demangle*/False, a, tmpbuf, N_TMPBUF,
+ /*match_anywhere_in_fun*/True,
+ /*show offset?*/False );
+ tmpbuf[N_TMPBUF-1] = 0; /* paranoia */
+ if (!ok)
+ return False;
+ /* We have something, at least. Try to Z-demangle it. */
+ ok = VG_(maybe_Z_demangle)(tmpbuf, NULL, 0, buf, nbuf, NULL);
+ if (!ok) {
+ /* Didn't Z-demangle, so just return whatever we have. */
+ VG_(strncpy)(buf, tmpbuf, nbuf);
+ }
+ buf[nbuf-1] = 0; /* paranoia */
+ return True;
+# undef N_TMPBUF
+}
+
/* Map a code address to the name of a shared object file or the executable.
Returns False if no idea; otherwise True. Doesn't require debug info.
Caller supplies buf and nbuf. */
break;
case FunName:
- // Nb: mangled names used in suppressions
- if (!VG_(get_fnname_nodemangle)(a, caller_name, ERRTXT_LEN))
+ // Nb: mangled names used in suppressions. Do, though,
+ // Z-demangle them, since otherwise it's possible to wind
+ // up comparing "malloc" in the suppression against
+ // "_vgrZU_libcZdsoZa_malloc" in the backtrace, and the
+ // two of them need to be made to match.
+ if (!VG_(get_fnname_Z_demangle_only)(a, caller_name, ERRTXT_LEN))
VG_(strcpy)(caller_name, "???");
break;
default: VG_(tool_panic)("supp_matches_callers");
guest_code_addr. Returns 0 if not known. */
extern Addr VG_(get_tocptr) ( Addr guest_code_addr );
+/* This is only available to core... don't demangle C++ names, but do
+ do Z-demangling, match anywhere in function, and don't show
+ offsets. */
+extern
+Bool VG_(get_fnname_Z_demangle_only) ( Addr a, Char* buf, Int nbuf );
+
#endif // __PUB_CORE_DEBUGINFO_H
/*--------------------------------------------------------------------*/