Ada demangling is now functional.
There maybe some missing functionality like the _GLOBAL_
mentioned in the bugzilla item.
/memcheck/tests/bug287260
/memcheck/tests/bug340392
/memcheck/tests/bug401284
+/memcheck/tests/bug445235_ada_demangle
/memcheck/tests/bug464969_d_demangle
/memcheck/tests/bug472219
/memcheck/tests/bug484002
option are deprecated and will be removed in a future valgrind
version.
+* Ada name demangling is now supported in error messages.
+
* ================== PLATFORM CHANGES =================
* S390X added support for the DFLTCC instruction provided by the
440180 s390x: Failed assertion in disassembler
444781 MIPS: wrong syscall numbers used
447989 Support Armv8.2 SHA-512 instructions
+445235 Java/Ada/D demangling is probably broken
453044 gbserver_tests failures in aarch64
479661 Valgrind leaks file descriptors
486180 [Valgrind][MIPS] 'VexGuestArchState' has no member named
/*--------------------------------------------------------------------*/
-/*--- Demangling of C++ mangled names. demangle.c ---*/
+/*--- Demangling of decorated names. demangle.c ---*/
/*--------------------------------------------------------------------*/
/*
#include "vg_libciface.h"
#include "demangle.h"
+Bool VG_(lang_is_ada) = False;
/*------------------------------------------------------------*/
/*--- ---*/
// XXX: the Java/Rust/Ada demangling here probably doesn't work. See
// https://bugs.kde.org/show_bug.cgi?id=445235 for details.
if (do_cxx_demangling && VG_(clo_demangle)
- && orig != NULL && orig[0] == '_'
- && (orig[1] == 'Z' || orig[1] == 'R' || orig[1] == 'D')) {
+ && orig != NULL && (VG_(lang_is_ada) ||
+ (orig[0] == '_' && (orig[1] == 'Z' || orig[1] == 'R' || orig[1] == 'D')))) {
/* !!! vvv STATIC vvv !!! */
static HChar* demangled = NULL;
/* !!! ^^^ STATIC ^^^ !!! */
}
if (orig[1] == 'D') {
demangled = dlang_demangle ( orig, DMGL_ANSI | DMGL_PARAMS );
+ } else if (VG_(lang_is_ada)) {
+ demangled = ada_demangle(orig, 0);
} else {
demangled = ML_(cplus_demangle) ( orig, DMGL_ANSI | DMGL_PARAMS );
}
alloc_symname_array(sym_name_pri, sym_names_sec, &twoslots[0]);
const HChar** names;
for (names = names_init; *names; names++) {
+ /*
+ * For Ada demangling, the language doesn't use a regular
+ * prefix like _Z or _R, so look for a common symbol and
+ * set a global flag.
+ */
+ if (!isText && VG_(strcmp)(*names, "__gnat_ada_main_program_name") == 0) {
+ VG_(lang_is_ada) = True;
+ }
isGlobal = False;
ok = VG_(maybe_Z_demangle)( *names,
&demangled_sopatt,
/*OUT*/Int* eclassTag, // may be NULL
/*OUT*/Int* eclassPrio ); // may be NULL
+/*
+ * ada doesn't use a simple prefix for its mangling like D, Rust and C++
+ * So when we see an ada-like symbol this global gets set.
+ */
+extern Bool VG_(lang_is_ada);
+
#endif // __PUB_CORE_DEMANGLE_H
/*--------------------------------------------------------------------*/
bug155125.stderr.exp bug155125.vgtest \
bug287260.stderr.exp bug287260.vgtest \
bug340392.stderr.exp bug340392.vgtest \
+ bug445235_ada_demangle.stderr.exp bug445235_ada_demangle.vgtest \
bug401284.stderr.exp bug401284.stdout.exp bug401284.vgtest \
bug464969_d_demangle.stderr.exp bug464969_d_demangle.vgtest \
bug464969_d_demangle.stdout.exp \
bug287260 \
bug340392 \
bug401284 \
+ bug445235_ada_demangle \
bug464969_d_demangle \
bug472219 \
calloc-overflow \
--- /dev/null
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "memcheck/memcheck.h"
+
+// this non-text symbol is required to trigger ada demangling
+const char* __gnat_ada_main_program_name = "some string";
+
+// the functions are transcribed from symbols in an
+// Ada hello world using a package
+void system__file_io__write_buf(char* m)
+{
+ if (m[4])
+ {
+ exit(-1);
+ }
+}
+
+void ada__text_io__put_line(char *m)
+{
+ system__file_io__write_buf(m);
+}
+
+void bad_print__uninit_print(char *m)
+{
+ ada__text_io__put_line(m);
+}
+
+void _ada_main(char* m)
+{
+ bad_print__uninit_print(m);
+}
+
+int main(void)
+{
+ char* HW = strdup("Hello, world!\n");
+ VALGRIND_MAKE_MEM_UNDEFINED(HW+4, 1);
+
+ _ada_main(HW);
+}
--- /dev/null
+Conditional jump or move depends on uninitialised value(s)
+ at 0x........: system.file_io.write_buf (bug445235_ada_demangle.c:13)
+ by 0x........: ada.text_io.put_line (bug445235_ada_demangle.c:21)
+ by 0x........: bad_print.uninit_print (bug445235_ada_demangle.c:26)
+ by 0x........: main (bug445235_ada_demangle.c:31)
+ by 0x........: main (bug445235_ada_demangle.c:39)
+
--- /dev/null
+prog: bug445235_ada_demangle
+vgopts: -q