gcc/libiberty/testsuite/rust-demangle-expected
Mark Wielaard d3b2ead595 libiberty rust-demangle, ignore .suffix
Rust symbols can have a .suffix because of compiler transformations.
These can be ignored in the demangled name. Which is what this patch
implements. By stopping at the first dot for v0 symbols and searching
backwards to the ending 'E' for legacy symbols.

An alternative implementation could be to follow what C++ does and
represent these as [clone .suffix] tagged onto the demangled name.
But this seems somewhat confusing since it results in a demangled
name that cannot be mangled again. And it would mean trying to
decode compiler internal naming.

https://bugs.kde.org/show_bug.cgi?id=445916
https://github.com/rust-lang/rust/issues/60705

libiberty/Changelog

	* rust-demangle.c (rust_demangle_callback): Ignore everything
	after '.' char in sym for v0. For legacy symbols search
	backwards to find the last 'E' before any '.'.
	* testsuite/rust-demangle-expected: Add new .suffix testcases.
2022-02-17 18:06:24 +01:00

324 lines
10 KiB
Plaintext

# 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 (legacy)
#
#
# 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$
# _ 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
#
--format=rust
_ZN11issue_609253foo37Foo$LT$issue_60925..llv$u6d$..Foo$GT$3foo17h059a991a004536adE
issue_60925::foo::Foo<issue_60925::llvm::Foo>::foo
--format=rust
_ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h000b1ad6c4f30bd6E
core::ops::function::FnOnce::call_once{{vtable.shim}}
#
############
#
# Coverage Tests (v0)
#
#
# Crate with a leading digit.
--format=rust
_RNvC6_123foo3bar
123foo::bar
# UTF-8 identifiers.
--format=rust
_RNqCs4fqI2P2rA04_11utf8_identsu30____7hkackfecea1cbdathfdh9hlq6y
utf8_idents::საჭმელად_გემრიელი_სადილი
# Closure path elements.
--format=rust
_RNCNCNgCs6DXkGYLi8lr_2cc5spawn00B5_
cc::spawn::{closure#0}::{closure#0}
#
--format=rust
_RNCINkXs25_NgCsbmNqQUJIY6D_4core5sliceINyB9_4IterhENuNgNoBb_4iter8iterator8Iterator9rpositionNCNgNpB9_6memchr7memrchrs_0E0Bb_
<core::slice::Iter<u8> as core::iter::iterator::Iterator>::rposition::<core::slice::memchr::memrchr::{closure#1}>::{closure#0}
# dyn Trait ("trait object") types.
--format=rust
_RINbNbCskIICzLVDPPb_5alloc5alloc8box_freeDINbNiB4_5boxed5FnBoxuEp6OutputuEL_ECs1iopQbuBiw2_3std
alloc::alloc::box_free::<dyn alloc::boxed::FnBox<(), Output = ()>>
# Types with const generics parameters.
--format=rust
_RNvMC0INtC8arrayvec8ArrayVechKj7b_E3new
<arrayvec::ArrayVec<u8, 123>>::new
#
--format=rust
_RMCs4fqI2P2rA04_13const_genericINtB0_8UnsignedKhb_E
<const_generic::Unsigned<11>>
#
--format=rust
_RMCs4fqI2P2rA04_13const_genericINtB0_6SignedKs98_E
<const_generic::Signed<152>>
#
--format=rust
_RMCs4fqI2P2rA04_13const_genericINtB0_6SignedKanb_E
<const_generic::Signed<-11>>
#
--format=rust
_RMCs4fqI2P2rA04_13const_genericINtB0_4BoolKb0_E
<const_generic::Bool<false>>
#
--format=rust
_RMCs4fqI2P2rA04_13const_genericINtB0_4BoolKb1_E
<const_generic::Bool<true>>
#
--format=rust
_RMCs4fqI2P2rA04_13const_genericINtB0_4CharKc76_E
<const_generic::Char<'v'>>
#
--format=rust
_RMCs4fqI2P2rA04_13const_genericINtB0_4CharKca_E
<const_generic::Char<'\n'>>
#
--format=rust
_RMCs4fqI2P2rA04_13const_genericINtB0_4CharKc2202_E
<const_generic::Char<'\u{2202}'>>
#
--format=rust
_RNvNvMCs4fqI2P2rA04_13const_genericINtB4_3FooKpE3foo3FOO
<const_generic::Foo<_>>::foo::FOO
#
# All of the tests above but in auto mode instead:
#
# Crate with a leading digit.
--format=auto
_RNvC6_123foo3bar
123foo::bar
# UTF-8 identifiers.
--format=auto
_RNqCs4fqI2P2rA04_11utf8_identsu30____7hkackfecea1cbdathfdh9hlq6y
utf8_idents::საჭმელად_გემრიელი_სადილი
# Closure path elements.
--format=auto
_RNCNCNgCs6DXkGYLi8lr_2cc5spawn00B5_
cc::spawn::{closure#0}::{closure#0}
#
--format=auto
_RNCINkXs25_NgCsbmNqQUJIY6D_4core5sliceINyB9_4IterhENuNgNoBb_4iter8iterator8Iterator9rpositionNCNgNpB9_6memchr7memrchrs_0E0Bb_
<core::slice::Iter<u8> as core::iter::iterator::Iterator>::rposition::<core::slice::memchr::memrchr::{closure#1}>::{closure#0}
# dyn Trait ("trait object") types.
--format=auto
_RINbNbCskIICzLVDPPb_5alloc5alloc8box_freeDINbNiB4_5boxed5FnBoxuEp6OutputuEL_ECs1iopQbuBiw2_3std
alloc::alloc::box_free::<dyn alloc::boxed::FnBox<(), Output = ()>>
# Types with const generics parameters.
--format=auto
_RNvMC0INtC8arrayvec8ArrayVechKj7b_E3new
<arrayvec::ArrayVec<u8, 123>>::new
#
--format=auto
_RMCs4fqI2P2rA04_13const_genericINtB0_8UnsignedKhb_E
<const_generic::Unsigned<11>>
#
--format=auto
_RMCs4fqI2P2rA04_13const_genericINtB0_6SignedKs98_E
<const_generic::Signed<152>>
#
--format=auto
_RMCs4fqI2P2rA04_13const_genericINtB0_6SignedKanb_E
<const_generic::Signed<-11>>
#
--format=auto
_RMCs4fqI2P2rA04_13const_genericINtB0_4BoolKb0_E
<const_generic::Bool<false>>
#
--format=auto
_RMCs4fqI2P2rA04_13const_genericINtB0_4BoolKb1_E
<const_generic::Bool<true>>
#
--format=auto
_RMCs4fqI2P2rA04_13const_genericINtB0_4CharKc76_E
<const_generic::Char<'v'>>
#
--format=auto
_RMCs4fqI2P2rA04_13const_genericINtB0_4CharKca_E
<const_generic::Char<'\n'>>
#
--format=auto
_RMCs4fqI2P2rA04_13const_genericINtB0_4CharKc2202_E
<const_generic::Char<'\u{2202}'>>
#
--format=auto
_RNvNvMCs4fqI2P2rA04_13const_genericINtB4_3FooKpE3foo3FOO
<const_generic::Foo<_>>::foo::FOO
#
# Suffixes
#
--format=rust
_RNvMs0_NtCs5l0EXMQXRMU_21rustc_data_structures17obligation_forestINtB5_16ObligationForestNtNtNtCsdozMG8X9FIu_21rustc_trait_selection6traits7fulfill26PendingPredicateObligationE22register_obligation_atB1v_.llvm.8517020237817239694
<rustc_data_structures::obligation_forest::ObligationForest<rustc_trait_selection::traits::fulfill::PendingPredicateObligation>>::register_obligation_at
--format=rust
_ZN4core3ptr85drop_in_place$LT$std..rt..lang_start$LT$$LP$$RP$$GT$..$u7b$$u7b$closure$u7d$$u7d$$GT$17h27f14859c664490dE.llvm.8091179795805947855
core::ptr::drop_in_place<std::rt::lang_start<()>::{{closure}}>
# old style rustc llvm thinlto
--format=rust
_ZN9backtrace3foo17hbb467fcdaea5d79bE.llvm.A5310EB9
backtrace::foo
--format=rust
_ZN9backtrace3foo17hbb467fcdaea5d79bE.llvm.A5310EB9@@16
backtrace::foo
# new style rustc llvm thinlto
--format=rust
_RC3foo.llvm.9D1C9369
foo
--format=rust
_RC3foo.llvm.9D1C9369@@16
foo
--format=rust
_RNvC9backtrace3foo.llvm.A5310EB9
backtrace::foo