chiark / gitweb /
lib/dpkg/tarfn.c: Kludge `tar_header_decode' to handle spurious `errno'.
[dpkg] / scripts / t / Dpkg_Shlibs_Cppfilt.t
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 }