<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/85423>85423</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Possibly incorrect or missing back reference registration for Microsoft name mangling
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
tahonermann
</td>
</tr>
</table>
<pre>
The Microsoft name mangling issue tracked by #83616 was due to a missing back reference registration that caused incorrectly resolved back reference indices to appear in mangled names resulting in ABI incompatibilities due to mismatched mangled names relative to those generated by MSVC. Producing a fix for that issue involved determining whether the back reference registration should or should not include the `$` character that preceded the implicit `TSS<discriminator>` name used for the corresponding symbol. Testing clarified that the `$` character should be included in the registration; though the implicitly generated name is registered as a back reference target, user-defined names written in source code should never be resolved to it. This was demonstrated in the following test:
```
namespace NS {
// The name "TSS0" for the name of the class below has been specifically
// chosen to ensure that back reference lookup does not match against the
// implicitly generated "$TSS0" name of the thread safe static initialization
// variable.
struct __declspec(dllexport) TSS0 {
static TSS0& get();
__forceinline static TSS0& singleton() {
static TSS0& lsv = get();
return lsv;
}
};
}
```
Following the fix in #85300, both MSVC and Clang generate the following mangled name for the synthesized guard variable.
- `?$TSS0@?1??singleton@ TSS0@ NS@@SAAAU23@XZ@4HA`
Had the `TSS0` name of the class been resolved to the registered back reference, the following (incorrect) mangled name would be generated:
- `?$TSS0@?1??singleton@ 0 NS@@SAAAU02@XZ@4HA`
This is a subtle issue that will only cause problems in unusual edge cases.
As part of preparing the fix in #85300, a brief audit of [`clang/lib/AST/MicrosoftMangle.cpp`](https://github.com/llvm/llvm-project/blob/main/clang/lib/AST/MicrosoftMangle.cpp) was performed to look for cases where a `$` is included in the mangled name, but not included as part of the name passed to `mangleSourceName()` to register a back reference candidate. These are all cases that require further analysis to determine if changes are needed. Ideally, tests would be added to exercise name mangling for each case.
- `mangleObjCProtocol()`
```
2021 Stream << "?$";
2022 Extra.mangleSourceName("Protocol");
```
- `mangleObjCLifetime()`
```
2035 Stream << "?$";
2036 switch (Quals.getObjCLifetime()) {
....
2040 case Qualifiers::OCL_Autoreleasing:
2041 Extra.mangleSourceName("Autoreleasing");
2042 break;
2043 case Qualifiers::OCL_Strong:
2044 Extra.mangleSourceName("Strong");
2045 break;
2046 case Qualifiers::OCL_Weak:
2047 Extra.mangleSourceName("Weak");
2048 break;
2049 }
```
- `mangleObjCKindOfType()`
```
2064 Stream << "?$";
2065 Extra.mangleSourceName("KindOf");
```
- `mangleAddressSpaceType()`
```
2304 Stream << "?$";
....
2307 if (Context.getASTContext().addressSpaceMapManglingFor(AS)) {
....
2309 Extra.mangleSourceName("_AS");
....
2311 } else {
2312 switch (AS) {
....
2315 case LangAS::opencl_global:
2316 Extra.mangleSourceName("_ASCLglobal");
2317 break;
2318 case LangAS::opencl_global_device:
2319 Extra.mangleSourceName("_ASCLdevice");
2320 break;
2321 case LangAS::opencl_global_host:
2322 Extra.mangleSourceName("_ASCLhost");
2323 break;
2324 case LangAS::opencl_local:
2325 Extra.mangleSourceName("_ASCLlocal");
2326 break;
2327 case LangAS::opencl_constant:
2328 Extra.mangleSourceName("_ASCLconstant");
2329 break;
2330 case LangAS::opencl_private:
2331 Extra.mangleSourceName("_ASCLprivate");
2332 break;
2333 case LangAS::opencl_generic:
2334 Extra.mangleSourceName("_ASCLgeneric");
2335 break;
2336 case LangAS::cuda_device:
2337 Extra.mangleSourceName("_ASCUdevice");
2338 break;
2339 case LangAS::cuda_constant:
2340 Extra.mangleSourceName("_ASCUconstant");
2341 break;
2342 case LangAS::cuda_shared:
2343 Extra.mangleSourceName("_ASCUshared");
2344 break;
```
- `mangleType(const ComplexType *, ...)`
```
3185 Stream << "?$";
3186 Extra.mangleSourceName("_Complex");
```
- `mangleType(const VectorType *, ...)`
```
3250 Stream << "?$";
3251 Extra.mangleSourceName("__vector");
```
- `mangleType(const ObjCObjectType *, ...)`
```
3334 Out << "?$";
3335 if (T->isObjCId())
3336 mangleSourceName("objc_object");
3337 else if (T->isObjCClass())
3338 mangleSourceName("objc_class");
3339 else
3340 mangleSourceName(T->getInterface()->getName());
```
- `mangleType(const AtomicType *, ...)`
```
3482 Stream << "?$";
3483 Extra.mangleSourceName("_Atomic");
```
- `mangleType(const PipeType *, ...)`
```
3496 Stream << "?$";
3497 Extra.mangleSourceName("ocl_pipe");
```
- `mangleType(const BitIntType *, ...)`
```
3534 Stream << "?$";
3535 if (T->isUnsigned())
3536 Extra.mangleSourceName("_UBitInt");
3537 else
3538 Extra.mangleSourceName("_BitInt");
```
Many of the functions above also contain calls to `mangleArtificialTagType()` that pass a sequence of string literals that are then passed to `mangleSourceName()` without a preceding `$` character. These names are not prefixed by a `$` in the mangled name at all, but perhaps they should be.
Finally, the following function looks like it has the same issue that `mangleThreadSafeStaticGuardVariable()` did prior to the change in #85300. Perhaps `$RT` should be mangled via a call to `mangleSourceName()`.
- `mangleReferenceTemporary()`
```
3914 Mangler.getStream() << "?$RT" << ManglingNumber << '@';
```
Of all of these, only the last (`mangleReferenceTemporary()`) looks likely to be relevant with regard to compatibility with MSVC. The rest involve languages that MSVC doesn't support (Objective-C), Clang extensions that MSVC doesn't support, or builtin types that are not yet implemented in MSVC (and thus it is not yet known what mangling should be used).
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycWV2T4rjO_jXpG9VQiRNouOgLhl7enXrn6yzMnlPnpktJFPCOsbO2Qzf760_ZSSB8BOipmuqBYEuPpEeSI6MxfCWJnoLhx2D4_ICVXSv9ZHGtJOkNSvmQqnz3tFwTfOGZVkYVFiRuCDYoV4LLFXBjKgKrMftJOaQ7CFg8jkfRCF7RQO5-U4Cw4ca45SlmP0FTQZpkRqBpxY3VaLmSYNdoIcPKUA5cZkpryqzYgSajxNZJP97MZc4zMl5BWRJq4LIGRrlHadzWSliPU8L04ycvd1Oi5SkX3HLaQ9xws0GbrSk_EyHQ8q1fZNfKEKxIkkZbm_tl8edsAN-1yqvM6UEo-BsUStfm1O7hcltbkJMlveHSrXxdk12TW0dX3WLWqhI5KN1-kso6O0SVk98cjMKAJcEohGyNGjNLjfJSU0Y55X4V35SCZ9y65cvFIohnOTeZ5hsu0SodxL85CT64PgK1CQQ-DqZUMnegzW6TKjGAJRnv1kyg5gX3OtD2wmmQp9QCdxH2q7umBvFH5-JqtT5CLHYdl3uA3DT7SFMOaABPPWhRr8gGbOaM0R9yKrjch_RVc2tJOghGVTpzRua0dy9tSTuoe95ZBdwOYLnmpmY1bZT0oA92FEoI9epcYsnYIJ4G4XMQTp0z6n_-q9dfYkbwdQHB48dmEZsHbA4uzbx5AWPLxSIMGNtHwT9XRR0RgcZASkK9whrdJ5JgSsp4wTMUYnckNXOclc4GkqbSVAfqxF1CqZ9VCbki4-nlUwFwhVwaH9UjkRcDEzAWsKTF3cVr15owB4MFgbFoeQZccstR8H_quHeFb1FzTAUN6qfG6iqz8PKSUyackQEb50LQW6m0DdgEnMaDK6HVUAMZgWfBOGCTIG6XvLwUSmfEpeCSTte7KiXIKlnv6ko-ky3MFoL4-ZIOANBkKy3dos7j4PG5sfbxef_48PCYLfXf-YFZjmf8zVHOVdlhHIaO4amya1-HAGUOM4FytY_LCTe7pW3PLbOTdk2G_0M5rCrU-WkMPvicjudtfBP3JXIP4vnBX0kIza_wdeHWJOFiOp3-YHGQhP_5b5CEye_TE9t-x7ytGX5vW4FOmE7yKBkPdcPn_zGXnUeOjQ7YeN9OXEiPnPDaFqY9k_e5e7fZJwaHrN9gX0O4K1imSq2gtn-6nHzlQoCSYlc3QSi1SgVtjIt3JStToQDKVwQZGjKDrtipgRK1dX4rNZWor9AFIdWcCsAq536H6_6jMHO8Cdhc8DRg8-liGbD5vul_8S4bZGXp7Bk-B2y8trY0zlc-bVfcrqt0kKmNEyG27X8fSq3-8n6fp0I5yRvkMmDze9WxiS-5JelC6U0df1etPHu9I1wj1QTYaTzOxyd9pht0nzSV7TZS30VaF-4LbonG1CqDUVhLWPiG8dVL8Sk_Ct3vLR3PO1GGMuc5WnINhAwBOrBCNOB95DX9XXFNUFTaHwlQotgZ7o827ZGBgBeuo8oVGS9DkuvtA_iUky_6jvdkrDlQGvO8Rk9vpDNu6OTs5lxImK09lG6u16Z-S_-afdfKqkyJvbFNITupVAAsZBEALKwm3EAQz4J45nuCzx__4WNnLYPf3qzGwUWnsoNWdlxVT9SegP3MC7K8E5mebQ5BPLwfbTwC88pdRwzY-F8VCjNYkb2g8bhfDAaDwUFIEgJ4R4OT4M5M2qdPPP02-_wyrazSJAhdYdlXIL8vuuqq442n_mJhwlwvglQT_jz-Ie5Hs7BancJIrsJodlzQP-zTP7rmj3_75V39j17ONQx-zwkCFibjPgAT6PTjW9z6fy7zb8VyV56x6wK5Rsn95BoNrxpV631HIkzzXJMxC3fKvAT3At44vBfvEaXj0MWEFy4rZkpaerMuL6aLZfOtVj3ADqIvWH5pys9c6YCNp4sbiROHk5uRf3FSTjzUEcLiKKpjDSQMdVWxOKoT5JDgHlE_nKgmtGfuZ5Sr6aJmrSpJZuJlJVSKokvdOBrdAj_73Gw7y584qnl_gcBxNL6B4iWnLc_oGMzkNphm2zkYFvaCYdEtMGvVeS_yW643AQ_Fb7oAJO4HkvQCESo7CQ27nnweQr3rAoZRP4bHXgyZe3NEeeKJ8W0Y-40XkEx6kcRhL5JS8y3aY3bE15uNB9LuO8cRs34ccT893MGbZ8c4rnebOmWafRdwDPtxjM5xZFWOl1IlfrwJ4kdvqsTjfgyTHgwXuZGEt1Fc4UYS9eJIWA8Os0bdeQ_ya-PbKJptFzAkPRj6u1jTubxhMFObUtCbewYBm7qTrivJ17taHI3vPuLF0Xh0q8U0IN7RiY9s-JMyq_Q7TWDDuuDeZwQbRrc75cvWA_lVM9xR6Fvq3ujeaYpLaYBvlb1lRZ299ali-SGIf-PGKf2U78_YnaUjuGymSv_KXlRav3meWBq7xIb6JHCmZibQmFNNcZvNV5Rl9cZzXZNG1-FREl4S5EGsyH6SlnSBWXNwa552Xjh_JWxTqzY8e2fIkjG7m3vJOL55RvMYfpV433lJ78U_Gd2Pf_J4A79yLZOX57X-TgM-chfad5owjO9-k4iH54nzQ_oLngupM4xvHEp_1HjPGT3cZ0_n0Y3zS4-si-POLyh37RCmqGRmuZIGMFVbAhRGQaakRS4hQyHM0Wxmqi0veMZRLHF19O7T3Ieg8ZM3-rvyoxlVgLF-VCa4JY2iGcegn5KTvHf-88rtWlUWsLlx8UPH81uQdgBUX0L4EY7ylzQFf6svk45mWOdzK3DYhGjHVyXpNZYOM-0ONyxHc8E5l_vZ0NFMtPWsn6UZEPwnAbf-OsGPhOtblv1o8kBpP8tfYEELPwv_vwp1_mczLj54JOc5lJor3Y5r68FVdxQ5gO8N_trmP5Zu4-GiqDV8yxHQB_tWHM4nWH-0U7glbUqlUe9uvw3Hk8jlXD2C1O6Ftk6_9j7gJAn_WAaMtU_bV9uv1SYlfVj7GCSh-3uD-t8KPxisyW_8mNKPg50DBRrrMvsu29ikE1cnQNX3WYK2KK3nK2haofbc7t6I7uof61vNpZ-zG9veX4JAuapw1Y4t_Z1DrsjIgD1aMFVZKu1R1kcEvqUPM194Zs21BL1ZksZn9BUJ3nANacWFdWmwK6mTmS5pdmT9LRRtSDaXcF5UwMYoc7Dryjg6c7Nf_VOqVwmvTsh-_nkgW2VckZwMHvKnOJ_EE3ygp-gxCofR5HE0fFg_4STLWJFG6SgMoyjHPC_CbMyQZUXIaJI-8CcWsiSMo2E0YiwZDjAdJiGbROPoEcP0sQiSkDbIxUCI7Wag9OrB59fTeJiw-EFgSsL4i3jGJL3WyedYNnx-0E9-lJ5WKxMkoeDGmoMUy62gp-_KGJ6K3eHi3Hnwnlv3Qum-y_2HSound8_5PXITsLm37H8BAAD__9XIors">