Commit | Line | Data |
---|---|---|
1479465f GJ |
1 | #!/usr/bin/perl |
2 | # | |
3 | # This program is free software; you can redistribute it and/or modify | |
4 | # it under the terms of the GNU General Public License as published by | |
5 | # the Free Software Foundation; either version 2 of the License, or | |
6 | # (at your option) any later version. | |
7 | # | |
8 | # This program is distributed in the hope that it will be useful, | |
9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
11 | # GNU General Public License for more details. | |
12 | # | |
13 | # You should have received a copy of the GNU General Public License | |
14 | # along with this program. If not, see <https://www.gnu.org/licenses/>. | |
15 | ||
16 | use strict; | |
17 | use warnings; | |
18 | ||
19 | use Test::More; | |
20 | use Test::Dpkg qw(:needs); | |
21 | ||
22 | test_needs_command('c++filt'); | |
23 | ||
24 | plan tests => 124; | |
25 | ||
26 | use_ok('Dpkg::Shlibs::Cppfilt'); | |
27 | ||
28 | # Simple C++ demangling tests | |
29 | is ( cppfilt_demangle_cpp('_ZNSt10istrstreamC1EPKcl'), | |
30 | 'std::istrstream::istrstream(char const*, long)', | |
31 | 'demangle symbol' ); | |
32 | is ( cppfilt_demangle_cpp('_ZNSt10istrstreamC1EPKcl@Base'), | |
33 | 'std::istrstream::istrstream(char const*, long)@Base', | |
34 | 'demangle symbol with extra postfix' ); | |
35 | is ( cppfilt_demangle_cpp('foobar _ZNSt10istrstreamC1EPKcl@Base'), | |
36 | 'foobar std::istrstream::istrstream(char const*, long)@Base', | |
37 | 'demangle symbol with garbage around it' ); | |
38 | is ( cppfilt_demangle_cpp('FoobarInvalidSymbol'), undef, | |
39 | 'non-demanglable string' ); | |
40 | ||
41 | # Mass C++ demangling. Checking if c++filt does not hang and cppfilt_demangle() | |
42 | # immediately provides a correct answer to the caller (i.e. no buffering). | |
43 | my @mangledtext = split(/\n+/s, <<'END'); | |
44 | 0000000000000000 DF *UND* 0000000000000000 GCC_3.0 _Unwind_SetIP | |
45 | 0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __towlower_l | |
46 | 0000000000000000 DO *UND* 0000000000000000 GLIBC_2.2.5 stdout | |
47 | 0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 wmemset | |
48 | 0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 fflush | |
49 | 0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 getc | |
50 | 0000000000000000 w D *UND* 0000000000000000 pthread_join | |
51 | 00000000000cfc22 g DO .rodata 0000000000000001 GLIBCXX_3.4 _ZNSt14numeric_limitsIyE17has_signaling_NaNE | |
52 | 0000000000088d80 w DF .text 0000000000000064 GLIBCXX_3.4 _ZNSt11__timepunctIcEC2Em | |
53 | 00000000002f40a0 w DO .data.rel.ro 0000000000000020 GLIBCXX_3.4 _ZTTSt14basic_ifstreamIwSt11char_traitsIwEE | |
54 | 000000000005a5f0 g DF .text 0000000000000063 GLIBCXX_3.4.11 _ZNVSt9__atomic011atomic_flag5clearESt12memory_order | |
55 | 00000000000bdc20 w DF .text 0000000000000024 GLIBCXX_3.4 _ZNSbIwSt11char_traitsIwESaIwEEC1EPKwmRKS1_ | |
56 | 0000000000063850 g DF .text 0000000000000062 GLIBCXX_3.4 _ZNSt5ctypeIwED2Ev | |
57 | 00000000000898b0 w DF .text 0000000000000255 GLIBCXX_3.4 _ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmPKcSB_ | |
58 | ||
59 | 00000000000bff30 g DF .text 0000000000000019 _ZNSt18condition_variable10notify_oneEv@GLIBCXX_3.4.11 | |
60 | 00000000000666a0 g DF .text 000000000000003f _ZNKSt3tr14hashIRKSbIwSt11char_traitsIwESaIwEEEclES6_@GLIBCXX_3.4.10 | |
61 | 00000000002f6160 w DO .data.rel.ro 0000000000000050 _ZTTSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@GLIBCXX_3.4 | |
62 | END | |
63 | ||
64 | my @demangledtext = split(/\n+/s, <<'END'); | |
65 | 0000000000000000 DF *UND* 0000000000000000 GCC_3.0 _Unwind_SetIP | |
66 | 0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __towlower_l | |
67 | 0000000000000000 DO *UND* 0000000000000000 GLIBC_2.2.5 stdout | |
68 | 0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 wmemset | |
69 | 0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 fflush | |
70 | 0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 getc | |
71 | 0000000000000000 w D *UND* 0000000000000000 pthread_join | |
72 | 00000000000cfc22 g DO .rodata 0000000000000001 GLIBCXX_3.4 std::numeric_limits<unsigned long long>::has_signaling_NaN | |
73 | 0000000000088d80 w DF .text 0000000000000064 GLIBCXX_3.4 std::__timepunct<char>::__timepunct(unsigned long) | |
74 | 00000000002f40a0 w DO .data.rel.ro 0000000000000020 GLIBCXX_3.4 VTT for std::basic_ifstream<wchar_t, std::char_traits<wchar_t> > | |
75 | 000000000005a5f0 g DF .text 0000000000000063 GLIBCXX_3.4.11 std::__atomic0::atomic_flag::clear(std::memory_order) volatile | |
76 | 00000000000bdc20 w DF .text 0000000000000024 GLIBCXX_3.4 std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::basic_string(wchar_t const*, unsigned long, std::allocator<wchar_t> const&) | |
77 | 0000000000063850 g DF .text 0000000000000062 GLIBCXX_3.4 std::ctype<wchar_t>::~ctype() | |
78 | 00000000000898b0 w DF .text 0000000000000255 GLIBCXX_3.4 std::time_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, tm const*, char const*, char const*) const | |
79 | ||
80 | 00000000000bff30 g DF .text 0000000000000019 std::condition_variable::notify_one()@GLIBCXX_3.4.11 | |
81 | 00000000000666a0 g DF .text 000000000000003f std::tr1::hash<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&>::operator()(std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&) const@GLIBCXX_3.4.10 | |
82 | 00000000002f6160 w DO .data.rel.ro 0000000000000050 VTT for std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4 | |
83 | END | |
84 | ||
85 | for my $try (1 .. 7) { | |
86 | for my $i (0 .. $#mangledtext) { | |
87 | my $demangled = cppfilt_demangle_cpp($mangledtext[$i]) || $mangledtext[$i]; | |
88 | is($demangled, $demangledtext[$i], "mass c++ demangling (${try}x" . (${i} + 1) . ')'); | |
89 | } | |
90 | } |