Issue |
147790
|
Summary |
Clang produces undemangleable symbols with Tk elements sometimes (when mangling concepted functions?)
|
Labels |
clang
|
Assignees |
|
Reporter |
nabijaczleweli
|
Downstream bug: https://bugs.debian.org/1108037
Building with Debian clang version 21.0.0 (++20250519112653+d0ee35851bb9-1~exp1~20250519112844.1459)
libbfd `bfd_demangle()`, libiberty `cplus_demangle()`, and libstdc++
`abi::__cxx_demangle()`, all fail to demangle this symbol, but `llvm-cxxfilt` succeeds
```
$ c++filt _ZN5Botan11Cipher_Mode6updateITkNS_8concepts21resizable_byte_bufferESt6vectorIhNS_16secure_allocatorIhEEEEEvRT_m
_ZN5Botan11Cipher_Mode6updateITkNS_8concepts21resizable_byte_bufferESt6vectorIhNS_16secure_allocatorIhEEEEEvRT_m
$ llvm-cxxfilt _ZN5Botan11Cipher_Mode6updateITkNS_8concepts21resizable_byte_bufferESt6vectorIhNS_16secure_allocatorIhEEEEEvRT_m
void Botan::Cipher_Mode::update<std::vector<unsigned char, Botan::secure_allocator<unsigned char>>>(std::vector<unsigned char, Botan::secure_allocator<unsigned char>>&, unsigned long)
```
this manifests as, for example, half-demangled perf:
```
Samples: 278K of event 'cycles:u', Event count (approx.): 183133005676
Children Self Command Shared Object Symbol
+ 98.44% 0.00% bench bench [.] main
+ 89.76% 0.00% bench bench [.] _ZN5Botan11Cipher_Mode6updateITkNS_8concepts21resizable_byte_bufferESt6vectorIhNS_16secure_allocatorIhEEEEEvRT_m
+ 89.76% 0.00% bench bench [.] Botan::Cipher_Mode::process(std::span<unsigned char, 18446744073709551615ul>)
+ 54.86% 0.00% bench bench [.] Botan::CBC_Encryption::finish_msg(std::vector<unsigned char, Botan::secure_allocator<unsigned char> >&, unsigned lo
+ 46.47% 0.16% bench bench [.] Botan::CBC_Encryption::process_msg(unsigned char*, unsigned long)
+ 43.29% 0.00% bench bench [.] Botan::CBC_Decryption::finish_msg(std::vector<unsigned char, Botan::secure_allocator<unsigned char> >&, unsigned lo
+ 43.28% 0.19% bench bench [.] Botan::CBC_Decryption::process_msg(unsigned char*, unsigned long)
+ 40.66% 0.07% bench bench [.] Botan::BlockCipher::encrypt(unsigned char*) const
+ 40.61% 2.70% bench bench [.] Botan::Twofish::encrypt_n(unsigned char const*, unsigned char*, unsigned long) const
+ 40.35% 0.00% bench [unknown] [k] 0000000000000000
+ 38.64% 2.30% bench bench [.] Botan::Twofish::decrypt_n(unsigned char const*, unsigned char*, unsigned long) const
+ 21.28% 12.28% bench bench [.] Botan::(anonymous namespace)::TF_E(unsigned int, unsigned int, unsigned int&, unsigned int&, unsigned int, unsigned
+ 20.93% 12.36% bench bench [.] Botan::(anonymous namespace)::TF_D(unsigned int, unsigned int, unsigned int&, unsigned int&, unsigned int, unsigned
+ 14.96% 11.71% bench bench [.] std::vector<unsigned int, Botan::secure_allocator<unsigned int> >::operator[](unsigned long) const
+ 9.29% 0.15% bench bench [.] Botan::xor_buf(unsigned char*, unsigned char const*, unsigned long)
+ 8.39% 0.00% bench bench [.] Botan::PKCS7_Padding::add_padding(std::vector<unsigned char, Botan::secure_allocator<unsigned char> >&, unsigned lo
+ 8.39% 0.00% bench bench [.] std::vector<unsigned char, Botan::secure_allocator<unsigned char> >::resize(unsigned long)
+ 8.39% 0.00% bench bench [.] std::vector<unsigned char, Botan::secure_allocator<unsigned char> >::_M_default_append(unsigned long)
+ 8.33% 0.00% bench bench [.] std::vector<unsigned char, Botan::secure_allocator<unsigned char> >::_S_relocate(unsigned char*, unsigned char*, un
+ 8.33% 0.00% bench bench [.] unsigned char* std::__relocate_a<unsigned char*, unsigned char*, Botan::secure_allocator<unsigned char> >(unsigned
+ 8.33% 0.90% bench bench [.] unsigned char* std::__relocate_a_1<unsigned char*, unsigned char*, Botan::secure_allocator<unsigned char> >(unsigne
+ 8.19% 3.06% bench bench [.] _ZN5Botan7xor_bufITkNS_6ranges23contiguous_output_rangeIhEESt4spanIhLm18446744073709551615EETkNS1_16contiguous_rang
+ 7.56% 1.01% bench bench [.] void std::__relocate_object_a<unsigned char, unsigned char, Botan::secure_allocator<unsigned char> >(unsigned char*
+ 7.34% 0.04% bench bench [.] auto Botan::load_le<Botan::detail::AutoDetect, unsigned char const*&, unsigned int&, unsigned int&, unsigned int&,
+ 7.29% 0.07% bench bench [.] _ZN5Botan6detail8load_anyILNS0_10EndiannessE1ENS0_10AutoDetectETpTkNS0_20unsigned_integralishEJjjjjEQaaaagtsZT1_Li0
+ 7.25% 0.05% bench bench [.] auto Botan::load_le<Botan::detail::AutoDetect, unsigned char const*&, unsigned int&, unsigned int&, unsigned int&,
+ 7.20% 0.06% bench bench [.] _ZN5Botan6detail8load_anyILNS0_10EndiannessE1ENS0_10AutoDetectETpTkNS0_20unsigned_integralishEJjjjjjjjjEQaaaagtsZT1
+ 7.18% 0.05% bench bench [.] auto Botan::store_le<Botan::detail::AutoDetect, unsigned char*&, unsigned int&, unsigned int&, unsigned int&, unsig
+ 7.13% 0.07% bench bench [.] _ZN5Botan6detail9store_anyILNS0_10EndiannessE1ENS0_10AutoDetectETkNS0_20unsigned_integralishEjTpTkNS0_20unsigned_in
+ 7.11% 0.39% bench bench [.] _ZN5Botan6detail8load_anyILNS0_10EndiannessE1ETkNS0_20unsigned_integralishEjTkNS_6ranges16contiguous_rangeIhEESt4sp
+ 7.02% 0.26% bench bench [.] _ZN5Botan6detail8load_anyILNS0_10EndiannessE1ENS0_10AutoDetectETkNS_6ranges16contiguous_rangeIhEESt4spanIKhLm16EETp
+ 7.01% 0.18% bench bench [.] _ZN5Botan6detail8load_anyILNS0_10EndiannessE1ENS0_10AutoDetectETkNS_6ranges16contiguous_rangeIhEESt4spanIKhLm32EETp
+ 6.88% 0.21% bench bench [.] _ZN5Botan6detail9store_anyILNS0_10EndiannessE1EjTkNS_6ranges23contiguous_output_rangeIhEESt4spanIhLm16EETpTkNS0_20u
+ 6.82% 0.42% bench bench [.] _ZZN5Botan6detail8load_anyILNS0_10EndiannessE1ENS0_10AutoDetectETkNS_6ranges16contiguous_rangeIhEESt4spanIKhLm32EET
+ 6.71% 0.40% bench bench [.] _ZZN5Botan6detail8load_anyILNS0_10EndiannessE1ENS0_10AutoDetectETkNS_6ranges16contiguous_rangeIhEESt4spanIKhLm16EET
+ 6.66% 0.07% bench bench [.] auto Botan::store_le<Botan::detail::AutoDetect, unsigned char*&, unsigned int&, unsigned int&, unsigned int&, unsig
+ 6.60% 0.32% bench bench [.] _ZZN5Botan6detail9store_anyILNS0_10EndiannessE1EjTkNS_6ranges23contiguous_output_rangeIhEESt4spanIhLm16EETpTkNS0_20
+ 6.60% 0.05% bench bench [.] _ZN5Botan6detail9store_anyILNS0_10EndiannessE1ENS0_10AutoDetectETkNS0_20unsigned_integralishEjTpTkNS0_20unsigned_in
+ 6.57% 0.41% bench bench [.] _ZN5Botan6detail9store_anyILNS0_10EndiannessE1ETkNS0_20unsigned_integralishEjTkNS_6ranges23contiguous_output_rangeI
+ 6.47% 0.23% bench bench [.] _ZN5Botan6detail9store_anyILNS0_10EndiannessE1EjTkNS_6ranges23contiguous_output_rangeIhEESt4spanIhLm32EETpTkNS0_20u
+ 6.28% 0.25% bench bench [.] _ZZN5Botan6detail8load_anyILNS0_10EndiannessE1ETkNS0_20unsigned_integralishEjTkNS_6ranges16contiguous_rangeIhEESt4s
+ 6.20% 0.30% bench bench [.] _ZZN5Botan6detail9store_anyILNS0_10EndiannessE1EjTkNS_6ranges23contiguous_output_rangeIhEESt4spanIhLm32EETpTkNS0_20
+ 6.03% 0.30% bench bench [.] _ZN5Botan13typecast_copyIjTkNS_6ranges16contiguous_rangeERSt4spanIKhLm4EEQaaaasr3stdE26is_default_constructible_vIT
+ 5.78% 0.36% bench bench [.] _ZN5Botan13typecast_copyIjTkNS_6ranges16contiguous_rangeERSt4spanIKhLm4EEQaaaasr3stdE23is_trivially_copyable_vINSt8
+ 5.64% 0.38% bench bench [.] _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERSt4spanIhLm4EEjQaaaasr3stdE23is_trivially_copyable_
+ 4.40% 0.00% bench [unknown] [k] 0x7e7e5a48fcfcb490
+ 3.88% 0.91% bench bench [.] decltype (_S_construct({parm#1}, {parm#2}, (std::forward<unsigned char>)({parm#3}))) std::allocator_traits<Botan::s
+ 3.69% 0.65% bench bench [.] _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERSt4spanIhLm4EETkNS1_16contiguous_rangeES2_IKjLm1EEQ
+ 3.68% 0.70% bench bench [.] _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeESt4spanIjLm1EETkNS1_16contiguous_rangeERS2_IKhLm4EEQ
+ 2.98% 0.90% bench bench [.] std::enable_if<__and_<std::__and_<std::__not_<std::allocator_traits<Botan::secure_allocator<unsigned char> >::__con
+ 2.79% 0.78% bench bench [.] void std::allocator_traits<Botan::secure_allocator<unsigned char> >::destroy<unsigned char>(Botan::secure_allocator
Cannot load tips.txt file, please install perf!
```
The actual symbol is found in src:botan3 3.7.1+dfsg-2 src/lib/modes/cbc/cbc.cpp (build/obj/lib/modes_cbc.o):
```cpp
class secure_allocator { /* ... */ };
using secure_vector = std::vector<T, secure_allocator<T>>;
class BOTAN_PUBLIC_API(2, 0) Cipher_Mode : public SymmetricAlgorithm {
template <concepts::resizable_byte_buffer T>
void update(T& buffer, size_t offset = 0) {
// ...
}
}
class CBC_Mode : public Cipher_Mode {}
class CBC_Encryption : public CBC_Mode {
private:
void finish_msg(secure_vector<uint8_t>& final_block, size_t offset = 0) override;
}
void CBC_Encryption::finish_msg(secure_vector<uint8_t>& buffer, size_t offset) {
// ...
update(buffer, offset);
}
```
equivalent to something like
```cpp
template<concepts::resizable_byte_buffer = std::vector<unsigned char, Botan::secure_allocator<unsigned char>>> // except as an instantiation, not a default
void Botan::Cipher_Mode::update(std::vector<unsigned char, Botan::secure_allocator<unsigned char>>, unsigned long);
```
it would be nice if clang produced mangled symbols that were understood by everyone else.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs