From 535aade664ac4170fe82e52c9addd686156220a1 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Wed, 16 Nov 2016 23:09:27 +0000 Subject: 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 Mark Wielaard * 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 Mark Wielaard * 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. --- libiberty/testsuite/Makefile.in | 7 +- libiberty/testsuite/rust-demangle-expected | 161 +++++++++++++++++++++++++++++ 2 files changed, 166 insertions(+), 2 deletions(-) create mode 100644 libiberty/testsuite/rust-demangle-expected (limited to 'libiberty/testsuite') 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 +>::bar +# +--format=rust +_ZN54_$LT$I$u20$as$u20$core..iter..traits..IntoIterator$GT$9into_iter17h8581507801fb8615E +::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 +::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::::is_null +# +--format=rust +_ZN40_$LT$alloc..raw_vec..RawVec$LT$T$GT$$GT$6double17h4166e2b47539e1ffE +>::double +# +--format=rust +_ZN39_$LT$collections..vec..Vec$LT$T$GT$$GT$4push17hd4b6b23c1b88141aE +>::push +# +--format=rust +_ZN70_$LT$collections..vec..Vec$LT$T$GT$$u20$as$u20$core..ops..DerefMut$GT$9deref_mut17hf299b860dc5a831cE + as core::ops::DerefMut>::deref_mut +# +--format=rust +_ZN63_$LT$core..ptr..Unique$LT$T$GT$$u20$as$u20$core..ops..Deref$GT$5deref17hc784b4a166cb5e5cE + as core::ops::Deref>::deref +# +--format=rust +_ZN40_$LT$alloc..raw_vec..RawVec$LT$T$GT$$GT$3ptr17h7570b6e9070b693bE +>::ptr +# +--format=rust +_ZN4core3ptr31_$LT$impl$u20$$BP$mut$u20$T$GT$7is_null17h0f3228f343444ac8E +core::ptr::::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::::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 +::next +# +--format=rust +_ZN54_$LT$I$u20$as$u20$core..iter..traits..IntoIterator$GT$9into_iter17he06cb713aae5b465E +::into_iter +# +--format=rust +_ZN71_$LT$collections..vec..IntoIter$LT$T$GT$$u20$as$u20$core..ops..Drop$GT$4drop17hf7f23304ebe62eedE + as core::ops::Drop>::drop +# +--format=rust +_ZN86_$LT$collections..vec..IntoIter$LT$T$GT$$u20$as$u20$core..iter..iterator..Iterator$GT$4next17h04b3fbf148c39713E + 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 + as core::ops::Drop>::drop +# +--format=rust +_ZN68_$LT$core..nonzero..NonZero$LT$T$GT$$u20$as$u20$core..ops..Deref$GT$5deref17hc49056f882aa46dbE + as core::ops::Deref>::deref +# +--format=rust +_ZN63_$LT$core..ptr..Unique$LT$T$GT$$u20$as$u20$core..ops..Deref$GT$5deref17h19f2ad4920655e85E + as core::ops::Deref>::deref -- cgit v1.1