diff options
author | David Tolnay <dtolnay@gmail.com> | 2016-11-16 23:09:27 +0000 |
---|---|---|
committer | Mark Wielaard <mark@klomp.org> | 2016-11-18 11:06:18 +0100 |
commit | 535aade664ac4170fe82e52c9addd686156220a1 (patch) | |
tree | f80aadb5735148f6fbf4419a34d5dd74b290eecf /libiberty/testsuite | |
parent | ddc5804ebd4b2be29ad4e3e259f5c6e907f34f26 (diff) | |
download | binutils-535aade664ac4170fe82e52c9addd686156220a1.zip binutils-535aade664ac4170fe82e52c9addd686156220a1.tar.gz binutils-535aade664ac4170fe82e52c9addd686156220a1.tar.bz2 |
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.
Diffstat (limited to 'libiberty/testsuite')
-rw-r--r-- | libiberty/testsuite/Makefile.in | 7 | ||||
-rw-r--r-- | libiberty/testsuite/rust-demangle-expected | 161 |
2 files changed, 166 insertions, 2 deletions
diff --git a/libiberty/testsuite/Makefile.in b/libiberty/testsuite/Makefile.in index 8f5f7b5..da0b2f4 100644 --- a/libiberty/testsuite/Makefile.in +++ b/libiberty/testsuite/Makefile.in @@ -45,8 +45,8 @@ all: # CHECK is set to "really_check" or the empty string by configure. check: @CHECK@ -really-check: check-cplus-dem check-d-demangle check-pexecute check-expandargv \ - check-strtol +really-check: check-cplus-dem check-d-demangle check-rust-demangle \ + check-pexecute check-expandargv check-strtol # Run some tests of the demangler. check-cplus-dem: test-demangle $(srcdir)/demangle-expected @@ -55,6 +55,9 @@ check-cplus-dem: test-demangle $(srcdir)/demangle-expected check-d-demangle: test-demangle $(srcdir)/d-demangle-expected ./test-demangle < $(srcdir)/d-demangle-expected +check-rust-demangle: test-demangle $(srcdir)/rust-demangle-expected + ./test-demangle < $(srcdir)/rust-demangle-expected + # Check the pexecute code. check-pexecute: test-pexecute ./test-pexecute diff --git a/libiberty/testsuite/rust-demangle-expected b/libiberty/testsuite/rust-demangle-expected new file mode 100644 index 0000000..0b4288f --- /dev/null +++ b/libiberty/testsuite/rust-demangle-expected @@ -0,0 +1,161 @@ +# This file holds test cases for the Rust demangler. +# Each test case looks like this: +# options +# input to be demangled +# expected output +# +# See demangle-expected for documentation of supported options. +# +# A line starting with `#' is ignored. +# However, blank lines in this file are NOT ignored. +# +############ +# +# Coverage Tests +# +# +# Demangles as rust symbol. +--format=rust +_ZN4main4main17he714a2e23ed7db23E +main::main +# Also demangles as c++ gnu v3 mangled symbol. But with extra Rust hash. +--format=gnu-v3 +_ZN4main4main17he714a2e23ed7db23E +main::main::he714a2e23ed7db23 +# But auto should demangle fully gnu-v3 -> rust -> demangled, not partially. +--format=auto +_ZN4main4main17he714a2e23ed7db23E +main::main +# Hash is exactly 16 hex chars. Not more. +--format=auto +_ZN4main4main18h1e714a2e23ed7db23E +main::main::h1e714a2e23ed7db23 +# Not less. +--format=auto +_ZN4main4main16h714a2e23ed7db23E +main::main::h714a2e23ed7db23 +# And not non-hex. +--format=auto +_ZN4main4main17he714a2e23ed7db2gE +main::main::he714a2e23ed7db2g +# $XX$ substitutions should not contain just numbers. +--format=auto +_ZN4main4$99$17he714a2e23ed7db23E +main::$99$::he714a2e23ed7db23 +# _ at start of path should be removed. +# ".." translates to "::" "$GT$" to ">" and "$LT$" to "<". +--format=rust +_ZN71_$LT$Test$u20$$u2b$$u20$$u27$static$u20$as$u20$foo..Bar$LT$Test$GT$$GT$3bar17h930b740aa94f1d3aE +<Test + 'static as foo::Bar<Test>>::bar +# +--format=rust +_ZN54_$LT$I$u20$as$u20$core..iter..traits..IntoIterator$GT$9into_iter17h8581507801fb8615E +<I as core::iter::traits::IntoIterator>::into_iter +# +--format=rust +_ZN10parse_tsan4main17hdbbfdf1c6a7e27d9E +parse_tsan::main +# +--format=rust +_ZN65_$LT$std..env..Args$u20$as$u20$core..iter..iterator..Iterator$GT$4next17h420a7c8d0c7eef40E +<std::env::Args as core::iter::iterator::Iterator>::next +# +--format=rust +_ZN4core3str9from_utf817hdcea28871313776dE +core::str::from_utf8 +# +--format=rust +_ZN4core3mem7size_of17h18bde9bb8c22e2cfE +core::mem::size_of +# +--format=rust +_ZN5alloc4heap8allocate17hd55c03e6cb81d924E +alloc::heap::allocate +# +--format=rust +_ZN4core3ptr8null_mut17h736cce09ca0ac11aE +core::ptr::null_mut +# +--format=rust +_ZN4core3ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$7is_null17h7f9de798bc3f0879E +core::ptr::<impl *mut T>::is_null +# +--format=rust +_ZN40_$LT$alloc..raw_vec..RawVec$LT$T$GT$$GT$6double17h4166e2b47539e1ffE +<alloc::raw_vec::RawVec<T>>::double +# +--format=rust +_ZN39_$LT$collections..vec..Vec$LT$T$GT$$GT$4push17hd4b6b23c1b88141aE +<collections::vec::Vec<T>>::push +# +--format=rust +_ZN70_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..ops..DerefMut$GT$9deref_mut17hf299b860dc5a831cE +<collections::vec::Vec<T> as core::ops::DerefMut>::deref_mut +# +--format=rust +_ZN63_$LT$core..ptr..Unique$LT$T$GT$$u20$as$u20$core..ops..Deref$GT$5deref17hc784b4a166cb5e5cE +<core::ptr::Unique<T> as core::ops::Deref>::deref +# +--format=rust +_ZN40_$LT$alloc..raw_vec..RawVec$LT$T$GT$$GT$3ptr17h7570b6e9070b693bE +<alloc::raw_vec::RawVec<T>>::ptr +# +--format=rust +_ZN4core3ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$7is_null17h0f3228f343444ac8E +core::ptr::<impl *mut T>::is_null +# +--format=rust +_ZN53_$LT$$u5b$T$u5d$$u20$as$u20$core..slice..SliceExt$GT$10as_mut_ptr17h153241df1c7d1666E +<[T] as core::slice::SliceExt>::as_mut_ptr +# +--format=rust +_ZN11collections5slice29_$LT$impl$u20$$u5b$T$u5d$$GT$10as_mut_ptr17hf12a6d0409938c96E +collections::slice::<impl [T]>::as_mut_ptr +# +--format=rust +_ZN4core3ptr5write17h651fe53ec860e780E +core::ptr::write +# +--format=rust +_ZN65_$LT$std..env..Args$u20$as$u20$core..iter..iterator..Iterator$GT$4next17h420a7c8d0c7eef40E +<std::env::Args as core::iter::iterator::Iterator>::next +# +--format=rust +_ZN54_$LT$I$u20$as$u20$core..iter..traits..IntoIterator$GT$9into_iter17he06cb713aae5b465E +<I as core::iter::traits::IntoIterator>::into_iter +# +--format=rust +_ZN71_$LT$collections..vec..IntoIter$LT$T$GT$$u20$as$u20$core..ops..Drop$GT$4drop17hf7f23304ebe62eedE +<collections::vec::IntoIter<T> as core::ops::Drop>::drop +# +--format=rust +_ZN86_$LT$collections..vec..IntoIter$LT$T$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$4next17h04b3fbf148c39713E +<collections::vec::IntoIter<T> as core::iter::iterator::Iterator>::next +# +--format=rust +_ZN75_$LT$$RF$$u27$a$u20$mut$u20$I$u20$as$u20$core..iter..iterator..Iterator$GT$4next17ha050492063e0fd20E +<&'a mut I as core::iter::iterator::Iterator>::next +# Different hashes are OK, they are just stripped. +--format=rust +_ZN13drop_contents17hfe3c0a68c8ad1c74E +drop_contents +# +--format=rust +_ZN13drop_contents17h48cb59bef15bb555E +drop_contents +# +--format=rust +_ZN4core3mem7size_of17h900b33157bf58f26E +core::mem::size_of +# +--format=rust +_ZN67_$LT$alloc..raw_vec..RawVec$LT$T$GT$$u20$as$u20$core..ops..Drop$GT$4drop17h96a5cf6e94807905E +<alloc::raw_vec::RawVec<T> as core::ops::Drop>::drop +# +--format=rust +_ZN68_$LT$core..nonzero..NonZero$LT$T$GT$$u20$as$u20$core..ops..Deref$GT$5deref17hc49056f882aa46dbE +<core::nonzero::NonZero<T> as core::ops::Deref>::deref +# +--format=rust +_ZN63_$LT$core..ptr..Unique$LT$T$GT$$u20$as$u20$core..ops..Deref$GT$5deref17h19f2ad4920655e85E +<core::ptr::Unique<T> as core::ops::Deref>::deref |