diff --git a/coregrind/m_debuginfo/symtab.c b/coregrind/m_debuginfo/symtab.c index 00d15c70a..d6ae7cfd9 100644 --- a/coregrind/m_debuginfo/symtab.c +++ b/coregrind/m_debuginfo/symtab.c @@ -2556,6 +2556,32 @@ Bool VG_(get_fnname_nodemangle) ( Addr a, Char* buf, Int nbuf ) /*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. */ diff --git a/coregrind/m_errormgr.c b/coregrind/m_errormgr.c index 62074ca22..6dc3bb83b 100644 --- a/coregrind/m_errormgr.c +++ b/coregrind/m_errormgr.c @@ -1110,8 +1110,12 @@ Bool supp_matches_callers(Error* err, Supp* su) 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"); diff --git a/coregrind/pub_core_debuginfo.h b/coregrind/pub_core_debuginfo.h index 32699f398..887aba00c 100644 --- a/coregrind/pub_core_debuginfo.h +++ b/coregrind/pub_core_debuginfo.h @@ -69,6 +69,12 @@ extern Bool VG_(use_CFI_info) ( /*MOD*/Addr* ipP, 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 /*--------------------------------------------------------------------*/