190_Dpkg_Shlibs_Cppfilt.t 5.5 KB

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