forked from Imagelibrary/binutils-gdb
libiberty: Add Rust symbol demangling.
Adds Rust symbol demangler. Rust mangles symbols using GNU_V3 style, adding a hash and various special character subtitutions. This adds a new rust style to cplus_demangle and adds 3 helper functions rust_demangle, rust_demangle_sym and rust_is_mangled. rust-demangle.c was written by David. Mark did the code formatting to GNU style and integration into the gcc/libiberty build system and testsuite. include/ChangeLog: 2016-11-03 David Tolnay <dtolnay@gmail.com> Mark Wielaard <mark@klomp.org> * demangle.h (DMGL_RUST): New macro. (DMGL_STYLE_MASK): Add DMGL_RUST. (demangling_styles): Add dlang_rust. (RUST_DEMANGLING_STYLE_STRING): New macro. (RUST_DEMANGLING): New macro. (rust_demangle): New prototype. (rust_is_mangled): Likewise. (rust_demangle_sym): Likewise. libiberty/ChangeLog: 2016-11-03 David Tolnay <dtolnay@gmail.com> Mark Wielaard <mark@klomp.org> * Makefile.in (CFILES): Add rust-demangle.c. (REQUIRED_OFILES): Add rust-demangle.o. * cplus-dem.c (libiberty_demanglers): Add rust_demangling case. (cplus_demangle): Handle RUST_DEMANGLING. (rust_demangle): New function. * rust-demangle.c: New file. * testsuite/Makefile.in (really-check): Add check-rust-demangle. (check-rust-demangle): New rule. * testsuite/rust-demangle-expected: New file.
This commit is contained in:
committed by
Mark Wielaard
parent
ddc5804ebd
commit
535aade664
@@ -322,6 +322,12 @@ const struct demangler_engine libiberty_demanglers[] =
|
||||
"DLANG style demangling"
|
||||
}
|
||||
,
|
||||
{
|
||||
RUST_DEMANGLING_STYLE_STRING,
|
||||
rust_demangling,
|
||||
"Rust style demangling"
|
||||
}
|
||||
,
|
||||
{
|
||||
NULL, unknown_demangling, NULL
|
||||
}
|
||||
@@ -874,10 +880,26 @@ cplus_demangle (const char *mangled, int options)
|
||||
work->options |= (int) current_demangling_style & DMGL_STYLE_MASK;
|
||||
|
||||
/* The V3 ABI demangling is implemented elsewhere. */
|
||||
if (GNU_V3_DEMANGLING || AUTO_DEMANGLING)
|
||||
if (GNU_V3_DEMANGLING || RUST_DEMANGLING || AUTO_DEMANGLING)
|
||||
{
|
||||
ret = cplus_demangle_v3 (mangled, work->options);
|
||||
if (ret || GNU_V3_DEMANGLING)
|
||||
if (GNU_V3_DEMANGLING)
|
||||
return ret;
|
||||
|
||||
if (ret)
|
||||
{
|
||||
/* Rust symbols are GNU_V3 mangled plus some extra subtitutions.
|
||||
The subtitutions are always smaller, so do in place changes. */
|
||||
if (rust_is_mangled (ret))
|
||||
rust_demangle_sym (ret);
|
||||
else if (RUST_DEMANGLING)
|
||||
{
|
||||
free (ret);
|
||||
ret = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (ret || RUST_DEMANGLING)
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -903,6 +925,27 @@ cplus_demangle (const char *mangled, int options)
|
||||
return (ret);
|
||||
}
|
||||
|
||||
char *
|
||||
rust_demangle (const char *mangled, int options)
|
||||
{
|
||||
/* Rust symbols are GNU_V3 mangled plus some extra subtitutions. */
|
||||
char *ret = cplus_demangle_v3 (mangled, options);
|
||||
|
||||
/* The Rust subtitutions are always smaller, so do in place changes. */
|
||||
if (ret != NULL)
|
||||
{
|
||||
if (rust_is_mangled (ret))
|
||||
rust_demangle_sym (ret);
|
||||
else
|
||||
{
|
||||
free (ret);
|
||||
ret = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Demangle ada names. The encoding is documented in gcc/ada/exp_dbug.ads. */
|
||||
|
||||
char *
|
||||
|
||||
Reference in New Issue
Block a user