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

Reply via email to