<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/134725>134725</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
LTO build of rpcs3 fails on Windows
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
oltolm
</td>
</tr>
</table>
<pre>
Hello I use clang 19.1.7 from MSYS2 clang64. Recently https://github.com/RPCS3/rpcs3 has enabled LTO. Now the release build is failing with
```
[build] ld.lld: error: undefined symbol: thread-local initialization routine for perf_stat<19226358023673171ull>::g_tls_perf_stat
[build] >>> referenced by C:/src/rpcs3/rpcs3/Emu/CPU/CPUThread.cpp
[build] >>> librpcs3_emu.a(CPUThread.cpp.obj)
[build] >>> referenced by C:/src/rpcs3/rpcs3/Emu/Memory/vm.cpp
[build] >>> librpcs3_emu.a(vm.cpp.obj)
[build]
```
I reduced it
`CMakeListsts.txt`
```cmake
cmake_minimum_required(VERSION 3.21)
project(lto VERSION 0.0.1 LANGUAGES C CXX)
add_executable(myexe src/myexe.cpp)
target_compile_features(myexe PRIVATE cxx_std_20)
target_link_options(myexe PRIVATE -municode)
set_property(TARGET myexe PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE)
```
`myexe.cpp`
```c++
#include "perf_meter.hpp"
int wmain(int argc, wchar_t** argv)
{
perf_meter<"DMA"_u32> perf_;
return 0;
}
```
`perf_meter.hpp`
```c++
template <auto ShortName> class perf_stat final {
static inline thread_local struct perf_stat_local {
// Local non-atomic values for increments
unsigned m_log[66]{};
perf_stat_local() noexcept {}
~perf_stat_local() {}
} g_tls_perf_stat;
public:
static void push(unsigned start_time) noexcept { (void)g_tls_perf_stat; }
};
template <auto ShortName, auto... SubEvents> class perf_meter {
public:
~perf_meter() { perf_stat<ShortName>::push(0); }
};
constexpr unsigned operator""_u32(const char* s, unsigned long long /*length*/)
{
return 0;
}
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysVluP2roW_jXmZWmi4BASHnjIcOkZaW4Cpqc9L5GTLMCtY-f4wsB-6G_fcpLCMG1H2tJGFkns9S1_62ozY_hOIk5JfEvi-YA5u1d6qoRVoh4UqjpN_4NCKLgDZxBKweQOhpNgGCSw1aqGh_XXNe3mx6MAVliitOIEe2sbQ6KM0CWhyx23e1cEpaoJXa6eZ-uI0KVuShPBnhlAyQqBFdxvngJ4VK9g9wgaBTKDUDguKuAGtowLLnfwyu2ehJkf47AfYUbi21aSxHMQVSBERaIMUGul_YuTFW65xArMqS6U8HN2r5FVN0KVTACX3HIm-F_MciVBK2e5RNgqDQ3qbW4ssySaDSeUjqM4DWk0TqJhMnRCkGjhLY2yXW6FyS_i16xaMT9A4xY1yhIrKE4w69xkdPnTKW-ei9oRupw9v3T_m5ZyUDbNH5ULXrTgHGsXMELTK1igim-ETv49ag9YK30idHmo_xmtTv4PfK5jewcaK-c5cXuO_OyBfcd7bqyxJrBH26fBG2RZs-9Iwqx95jWXvHZ1rvH_jmusCE0_L1bru6dHiAI67Eg0Wn3D0hKaCqvg53oYhMEQ7rPHTy_Zp8UaZjD78qVnHWasqnI8Yumsz2JC0_qER4TOae1765hW3DK9Q5uXqm64wHyLzDqN5gx6Xt19zjYLKI_H3Ngqp-EVTnD5PVeNz9BfMTe1k7xUFZ6ZGbR5o1WD2p4ITTfZ6tNiAz9RT8-L1eYr3D1uFqvn1dNsMX9ZZff50_Pm7uHuf9nGW75ZvSx6dW9rrf28mPar5wm99SPMCI24LIWrEAilbWnUaFEHe-8S2uG4tPBaMy4JTf0707uS0Bm8lnumc0toRmjmZw89l8SrBgC4KCTRjFA6f8gIpbmLqM-5dpVErbBG67SEsPskyfy3Nr0j-IFhFutGMItAohlzVsF6r7R9ZDX6nUvBjLk0DthyyQRcePtJXgKXwjeZrhHlXSMyVrvSXrD99AXrf11bhft2SSp5w6yqeQkHJhyatmtxWWqsUVrjcU62jb6COhdqR-Lb8ZjEc680mfcuuWh_tzehKaETkAqPJTYWelQH-fF74SsZTziZw_v2eNm2cYXgpW82V-45KF5B48ye0PRsgLFM29zyGt-TAt9VFK8Infy6FfR03pj7QQjpDPxMEASwdsXi0LrxOq5tlpzDcmXBjzdpeXbH1THyNlm6s6M3s63337ItlTQWj42-xNJXNrNK-0Lqs56mrRz4yvFFY7wpZ4BQctf9tQmUCZQ7u2_ra_m-tD4smEE1japJNGEDnA6T0SiMUxqOBvvpkE5wPA6rMBlvk2I4GqXDOIljNi7jLavScsCnNKRxOAoTGkbj0SigFMfblLIqHVWsqBIyCrFmXARCHOpA6d2AG-NwOoxGCY0HghUoTHtfoVTiK7Sr3gPxfKCnHnRTuJ0ho1D4w-GixnIrcHq_eeqvFGoL3RXEXywMKAn_5bJSr2bgtJh-cIHxGvvHzfnAWLY8DKHLnuhhSv8OAAD___F-32g">