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.
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.
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/>.
20 use Test
::Dpkg
qw(:needs);
24 test_needs_command
('c++filt');
26 if (defined $Config{bin_ELF
} && $Config{bin_ELF
} eq 'define') {
29 plan skip_all
=> 'only ELF is currently supported';
32 use_ok
('Dpkg::Shlibs::Cppfilt');
34 # Simple C++ demangling tests
35 is
(cppfilt_demangle_cpp
('_ZNSt10istrstreamC1EPKcl'),
36 'std::istrstream::istrstream(char const*, long)',
38 is
(cppfilt_demangle_cpp
('_ZNSt10istrstreamC1EPKcl@Base'),
39 'std::istrstream::istrstream(char const*, long)@Base',
40 'demangle symbol with extra postfix');
41 is
(cppfilt_demangle_cpp
('foobar _ZNSt10istrstreamC1EPKcl@Base'),
42 'foobar std::istrstream::istrstream(char const*, long)@Base',
43 'demangle symbol with garbage around it');
44 is
(cppfilt_demangle_cpp
('_ZN13AngleBracketsrSEi'),
45 'AngleBrackets::operator>>=(int)',
46 'demangle symbol exempt from normalized angle brackets');
47 is
(cppfilt_demangle_cpp
('_ZN13AngleBracketsrSIfEEvT_'),
48 'void AngleBrackets::operator>>=<float>(float)',
49 'demangle template symbol exempt from normalized angle brackets');
50 is
(cppfilt_demangle_cpp
('FoobarInvalidSymbol'), undef,
51 'non-demanglable string');
53 # Mass C++ demangling. Checking if c++filt does not hang and cppfilt_demangle()
54 # immediately provides a correct answer to the caller (i.e. no buffering).
55 my @mangledtext = split(/\n+/s, <<'END');
56 0000000000000000 DF *UND* 0000000000000000 GCC_3.0 _Unwind_SetIP
57 0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __towlower_l
58 0000000000000000 DO *UND* 0000000000000000 GLIBC_2.2.5 stdout
59 0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 wmemset
60 0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 fflush
61 0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 getc
62 0000000000000000 w D *UND* 0000000000000000 pthread_join
63 00000000000cfc22 g DO .rodata 0000000000000001 GLIBCXX_3.4 _ZNSt14numeric_limitsIyE17has_signaling_NaNE
64 0000000000088d80 w DF .text 0000000000000064 GLIBCXX_3.4 _ZNSt11__timepunctIcEC2Em
65 00000000002f40a0 w DO .data.rel.ro 0000000000000020 GLIBCXX_3.4 _ZTTSt14basic_ifstreamIwSt11char_traitsIwEE
66 000000000005a5f0 g DF .text 0000000000000063 GLIBCXX_3.4.11 _ZNVSt9__atomic011atomic_flag5clearESt12memory_order
67 00000000000bdc20 w DF .text 0000000000000024 GLIBCXX_3.4 _ZNSbIwSt11char_traitsIwESaIwEEC1EPKwmRKS1_
68 0000000000063850 g DF .text 0000000000000062 GLIBCXX_3.4 _ZNSt5ctypeIwED2Ev
69 00000000000898b0 w DF .text 0000000000000255 GLIBCXX_3.4 _ZNKSt8time_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE3putES3_RSt8ios_basecPK2tmPKcSB_
71 00000000000bff30 g DF .text 0000000000000019 _ZNSt18condition_variable10notify_oneEv@GLIBCXX_3.4.11
72 00000000000666a0 g DF .text 000000000000003f _ZNKSt3tr14hashIRKSbIwSt11char_traitsIwESaIwEEEclES6_@GLIBCXX_3.4.10
73 00000000002f6160 w DO .data.rel.ro 0000000000000050 _ZTTSt18basic_stringstreamIcSt11char_traitsIcESaIcEE@GLIBCXX_3.4
75 0000000000001170 g DF .text 0000000000000001 _ZN13AngleBracketsrSEi
76 0000000000001190 g DF .text 0000000000000001 _ZN13AngleBracketsrSIfEEvT_
77 0000000000001180 g DF .text 0000000000000001 _ZN13AngleBracketsrsIfEEvT_
78 0000000000001160 g DF .text 0000000000000001 _ZN13AngleBracketsrsEi
81 my @demangledtext = split(/\n+/s, <<'END');
82 0000000000000000 DF *UND* 0000000000000000 GCC_3.0 _Unwind_SetIP
83 0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __towlower_l
84 0000000000000000 DO *UND* 0000000000000000 GLIBC_2.2.5 stdout
85 0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 wmemset
86 0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 fflush
87 0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 getc
88 0000000000000000 w D *UND* 0000000000000000 pthread_join
89 00000000000cfc22 g DO .rodata 0000000000000001 GLIBCXX_3.4 std::numeric_limits<unsigned long long>::has_signaling_NaN
90 0000000000088d80 w DF .text 0000000000000064 GLIBCXX_3.4 std::__timepunct<char>::__timepunct(unsigned long)
91 00000000002f40a0 w DO .data.rel.ro 0000000000000020 GLIBCXX_3.4 VTT for std::basic_ifstream<wchar_t, std::char_traits<wchar_t> >
92 000000000005a5f0 g DF .text 0000000000000063 GLIBCXX_3.4.11 std::__atomic0::atomic_flag::clear(std::memory_order) volatile
93 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&)
94 0000000000063850 g DF .text 0000000000000062 GLIBCXX_3.4 std::ctype<wchar_t>::~ctype()
95 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
97 00000000000bff30 g DF .text 0000000000000019 std::condition_variable::notify_one()@GLIBCXX_3.4.11
98 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
99 00000000002f6160 w DO .data.rel.ro 0000000000000050 VTT for std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >@GLIBCXX_3.4
101 0000000000001170 g DF .text 0000000000000001 AngleBrackets::operator>>=(int)
102 0000000000001190 g DF .text 0000000000000001 void AngleBrackets::operator>>=<float>(float)
103 0000000000001180 g DF .text 0000000000000001 void AngleBrackets::operator>><float>(float)
104 0000000000001160 g DF .text 0000000000000001 AngleBrackets::operator>>(int)
107 for my $try (1 .. 7) {
108 for my $i (0 .. $#mangledtext) {
109 my $demangled = cppfilt_demangle_cpp
($mangledtext[$i]) || $mangledtext[$i];
110 is
($demangled, $demangledtext[$i], "mass c++ demangling (${try}x" . (${i
} + 1) . ')');