<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/98479>98479</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Addresses of TLS variables are kept alive across fiber/stack-full coroutine context switches which may result in a crash
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
omern1
</td>
</tr>
</table>
<pre>
``` c++
thread_local void* tls_foo;
extern void do_stuff(void*);
int test() {
do_stuff(tls_foo);
do_stuff(tls_foo);
return 0;
}
```
In our (Sony's) private repro `test` is executing on a fiber created by an M:N fiber library (stack-full coroutines) and `do_stuff` causes the fiber to be suspended.
When `test` resumes execution it's likely that it won't be running on the same OS thread as it was before it was suspended.
This means that the TLS address loaded by `call load_address_for_tls@PLT` won't be valid on the new thread and will cause a crash.
``` asm
push rbp
mov rbp, rsp
push rbx
push rax
lea rdi, [rip + tls_foo@TLSLD]
call load_address_for_tls@PLT
mov rdi, qword ptr [rax + tls_foo@DTPOFF]
mov rbx, rax
; When using fibers, do_stuff could return on a different thread.
call _Z8do_stuffPv@PLT
; We want the TLS address to be reloaded here.
mov rdi, qword ptr [rbx + tls_foo@DTPOFF]
call _Z8do_stuffPv@PLT
xor eax, eax
add rsp, 8
pop rbx
pop rbp
ret
```
[MSVC has the `/GT` commandline option](https://learn.microsoft.com/en-us/cpp/build/reference/gt-support-fiber-safe-thread-local-storage) which makes it reload the TLS address before each load of a TLS variable and I think we probably need something similar in LLVM.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVVuP2zgP_TXKC5HAkXN9yMNMB_lQIP1aYAZdYF8CWqJj7ciSV5Jz-fcLyXaSubTowBgnIUWeQx5S6L06GKINmz-y-dMI21BZt7E1OTMdFVZeNmyRdQ8Ixh_jkz2x7CFUjlDutRWo4WiVZPwBgvb70lqW907dfzoHciY5gbR7H9qyZHzVH2J8_c5fmQCBfGB8xfga2LK33h8eMt0dBoA_8HAUWmcgu-VcPvUfBqL3WL4asK0DxlfP1lwYX_oIqXHqiIHAUeMssEWW4C4yUB7oTKINyhzAGkAoVUEOhCMMJKG4ABr4xvKH__cWrQqH7hIz-IDidVy2WoOwzsYglNKhkTHJlVzsBbaePISK-jjBQkHgW9-QkSQnHfy_KjL3-Bz5tqYrSGtAhUgKtHolfYFQYQAV4GQN48sQQ7rWmJ5NzOaxJvj-DF3_AX1yRw8FldbR8O0GBDokL5XyUBMa3yWJsV52z4BSOvIetEXZFYgtMoFap1_2vXlfWrcP2rNZ9mP3EpncITyiVnLAZ-h0xWYknFSsZiwWIAiHvprct_cmbvT1TSTxr2l9lQRTNG8NtT3CYOBfwPnBfjtx_kUofGfQhF0oqWIoNn90qgHGH6-TNMteds-7JzZ_ensyVShG-HWRPoDus_x7sk5CE1zKh-d3-Z5efnzfbj8kvLE-J9YDFZY_QlJZ66NKkhh99BjUCsK2Wg5zl2ZCqrIkR3HMU6cmn3Db_70aIvw43jNKCQlOaD6KqBsCR72YKnI0xL7i_6wIxR8W4ffIBq-zdelNmEpF77uOUnZQfBLQapCPbeBz-VwN75ToKPxmdbH547fnn1-gwm5PRDPf_i9Nj7B1jUZqZQhsExdB5MpXVQiNZ_kD41vGt5rQmUmthLPelmEibM34lsy49YxvRdMwvi1apSXjW0eppYIY3x7C2LdNY10YJz2MPZY07no9TjfG2Afr8EBxu50qJSqo8ZXSLum696G1_XohFFUSPdgSMHkc0SksNKV5_wqhUuYVTgSNswUW-gKGSIK3NUXTAbyqlUYHysBu9_PbZCQ3uVznaxzRZrrk2TLLV_P1qNrMF6UUszyfr9c5z_lyLmjBpyIXs3W2EjQdqQ3P-CxbTqfTfLrMV5NlyakgIedivsoW0yWbZVSj0hOtj_XEusNIed_SZr2aLdcjjQVpn65ezuPeSkbGebyJ3SaeGRftIc6zVj74W5SggqbNQ1ca8rEW95XwgI7glZoAqNWRAGMHfTecjG8_u2hAWBPoHMCfVBAV-WtfLunW0CEWrN-ho9bpzVutHFSo2qKXSATav8aNs_-QCIxvE72onI7-ccP_CwAA___2CaAl">