<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/147790>147790</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Clang produces undemangleable symbols with Tk elements sometimes (when mangling concepted functions?)
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
nabijaczleweli
</td>
</tr>
</table>
<pre>
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.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzUW0lz27jW_TX0BhUWCXAQF15IslzlL-l0uuVv0xsWSIISbBDgI0DZyqJ_-yuAGkCZsiXFTvJULkcGMZxz78HFwBssJV1wQq6dcOKEN1e4VUvRXHOc0Qecf2fkiTB6lYlifX0jnrhUDcEVyNqFg8ZgqVQtHTR24K0Db7N2Id2CZBRzVzQLB976vjfyUOx4Y8cbT1rKCsoX4ImqJbgx9UDOMF-AFWkkFRxA3_VcDzhw5MCJAyfQg6EX-onvwyhEDpwUHiEoHIV-liWf_H_Jc-3_a1UaBYHrB2HiwKQbk9EsKwvgRF5WFmlBKswXjJj-EyfyHDgFjGY0I41a61p5zVo5XA_zQteVqsg7cHqEyMMZ1QZA4zTNn5-PNGUMlJgyoATYVgBqSSWQ6yoTTNfJWqUBMLaqPuXPzyVlyok8INs8J6SQ3WCbH2_swABsYOiaIP3nazgRCnPfn9J6SZr0D1GQqK0LrMjd_ePXeTrKBc9JrST0GyLpd5wxkmZrRdKsLUvSzOYqWpFcieZu-XWe-pEkeduQFDMmcmyKZ_qz-vs-rRxv_AuG1KxtA_0K2itBC2DG7NxujdsVdIM7aCpV0ZV03Tto2nIz1wqQL3GjnW71czjsi-potvmBow_pGUa63e4JE3yxmUaW7oxoK8xpSaSSAEvdphQNIM-4qrXsp2CJWflpK_MC1KQpNZB-RwDMTQMdPQCMR5-BKAFZEa6AA-N8nXePWgfGus-ZeZKL1jwf4bpuxLOr8aEx8EfIR8jzwiiOTNcATJeUFQ3hwHzmhJVgKqpKz2EwX-KGFODP7IHkCmw_824m6uYOnAAAkpEbBA4MzVPP9TzzPSM8X-qS7osTTlwnvAEVptxqO0rcODq17S8Q8TkwDz9b2K_NgboROZHSlqqsde2XQvVHQRDFQeDFKPaSMPQjP2yZEWRiWTQM3NHJFrWhTabpjOfNulZUbMpKyqlcppVcfMRcAoOTyaISRG4Qa_ie60eXWnyA1sboG14HLMZHJncHKkAuTN5DCJNpekN-L2sjVy_FxtrJO9L6EWt7bmRrOb4Q1oSJ_LGbe10B6RQxiCcBueBS2Zbx3MjfwoBubJx-Por7J1FSuewhSPkhhs3oB5Z5xVpDcFF4RKNOOGn5IxdPXIM7APyoy7yDj9UxGrlRsLcDsju-zAoF-TArQH8jZwCAD7ff346DetHkgq8r0UrAcUVkjXPSLaAa_m06s8FSrnpwBv-OTira_23T8NwEaeg-dNGlQfBtTjc_k5MfuMl2Wvu-G_uvueaVQLgZ4cQ4qGtvwqCpK2rSmDrmOGfzPyYpkPSCvx-eKKln0ejtx1vR77juD-Oi3pG46D3WoW-fp_M4_YYLfd7sinBRpPWm4FesQztq59L6GKimstlLkgGN_Oa40z_SgpS4ZSrFdU14cYTCngG6VFQfyWKeNsRUJKfMoV3ZgXPepLalctjbnlu6A5LilwyPQrlkhowGAucBi-ScjchppFL_J9Hqs_J3sQy5XnQGq92RMN4E2e4YGDWYL4iEKBdc0UUrWpmKVtWtSs0Tfcqbq0Afte6WX6qho9VspnvyUz-y-tCNrfkSu-Fue-q73uA6dgy5uR4Z8oEwx-0hfb3wwg8qa-dLyxexi4JNEAvOoYNbJWw0TOAiZcRBU6uwIApT1n0ft0rcEEVy9doieNou40hRn1fv3DZ4knghqqgDPDJkMF_fffk691Lfm_GCYs6JlDN_1hXt6czua60cL4XeFlJKuSKLBjMql7P_e3h4eJj9hTHGCyX_uffTL9TriQrau_fBTcb_sBc8i9vgfvYneuHQEz0v-KP38oJUoiGXuuHHHdAV9d3go0snQ9KxOd0Pr3nhYdBLfTf4e6TorHuJ8wT0Bk5rVXmxIuyXkx5yD-6Rw7OObj8q_dPAYn73WS9-0Wx2f4Dcsrk_eHD-LZAjeIA8ckfWpIVnrcdn6vzhon2GMfVOaX3klloCeB7yn270HvLYUktw1pnh5yI31u8hv_xy8bcP8ZEbWSstGhTUUTd8vPb7bvAuXWl_7eIUuWFsSf8jw83pq9Nxf_SQBxZyiH63QNlF9uFACe0Qf6ZafvqOoI_cnpE_Fig_3ug95B66HPn2nS1S65rkWKo0F_X67g0Dzv62Q3cw67bpskFSFTMYUbm72DLHlKbNFc0YSVd3dogP3dhSy3n35x-DHFGZqoauKGZsbfrDHeyvczXqIY-sd-rosk3YIfKTVLHH38F_OAW_hTzYbgIGb9pOeAH1HJOYhDgYlXmZZ0Fiv4ICqLfFS159dVCQnGkDAAeO0vleKA4cOfGkxk3lQOQ78Y1eQfclcFti3X6XonnCTTGUEQKTXn_ItE66n_0Fz-5aJlUNpkr2NwqyTzGyriqi8JLrsHfx_JELMDKbw_Tu88OXyp_N_rI8j9zI8k38PnHiNORb4B2oo8D_Nsg309JCDt1kdHivevbFN-FmKtDSQdM0xbxI7dymoRIuVK_kDZGcdWeu5W6rCrqxpar4rIDSv6t8R5QFkaoR68FpNXqtU01sijkXCug1HChaS1c9K1DSLreqZgRLAiiXCjPW5VZB_zA50BvfLwnAuWox26QYAipBKVqud9dANrmDxpkGggByY9d34KQo5eITNM_gLaOZA28rURDpwNs8y7vfbl7XOoBkLWWFA29F9tCvnOpKYvMK1kKV1_pAmzMsJThkrWMUMBmkY-C6LjDnhlugAw6aON64lZQvtq261zDAQUOvZu61iQY8db9Nnpt01ulwTP68H39Nv_3_5MvdNB1_u3OgPqxOgacjnJXSBBw0BnWbMZqD-bqqiGpoPmYL0VC1rDR64zdFqpphpatPt-la1mu2w5QtYEDphkaGm6xBOLp3YAS6KoYN_U5SBURZSqIMbQNvOyjoDHerDddNi_hGc-x-b5lOJ9MXTHoE40nXYl99n1zUa7TryIxfN3Rlch2Nr73EMOnn-9he0_OBcjVKVfeyVFfFLM2YyB9f4SpWpGloQTbu21Izg72d3vUqgCN2ti3cs68p2blq33rXrIfRmpLkPy1dYUa4AkoAKSqillrVjD6Sl_NkK6UTlTQ8Gd4l2XTHnzxrGABLgHkXfrii2BgdToEOWBhstq5nJMl-VCrrQJIBmhy4hCrwJFpWgIwATnMCaLnJRq8bUbQ5KcA2hbULoRKoJVbgiTQEtLwgjVRCFCBbA7IizVpwAgiTxL0qrlGRoARfkWs_DqE3gnHsXS2vgxzlMI-jAIVhUQZFkhUxxEGSJRkMYVRc0WuTyx57iR-jBHluEEM_hznGHsxg5JVO4JEKU-Yytqpc0SyuqJQtufaDOE68K4YzwqTJ5IfQcHEgdMKbq-bapE1n7UI6gceoVHLfhaKKkeupTV0agh19LbedBUzq_v0jIIxUhCvZSZlWROpl4WlJeGc0re2NdEkBypbnWirSQbcOTK7ahl33_-vAgqplm7m5qPR6wlbbfz7VjXgwl0u3hqlejTZkV9fwvwEAAP__7pC38Q">