<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/117192>117192</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Clang ignores -femulated-tls on Darwin with LTO enabled
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Un1q32
</td>
</tr>
</table>
<pre>
`tls.c`:
```c
#include <pthread.h>
#include <stdio.h>
__thread int var = 0;
void *func(void *arg) {
(void)arg;
if (var == 0)
var = 1;
else
puts("race");
return NULL;
}
int main(void) {
pthread_t ptid;
int i = 0;
while (i < 10) {
pthread_create(&ptid, NULL, func, NULL);
i++;
}
return 0;
}
```
Run on macOS:
```
$ clang -mmacos-version-min=14.0 tls.c -c
$ ld -arch x86_64 -platform_version macos 14.0 14.0 tls.o
Undefined symbols for architecture x86_64:
"__tlv_bootstrap", referenced from:
_var in tls.o
"_pthread_create", referenced from:
_main in tls.o
"_puts", referenced from:
_func in tls.o
ld: symbol(s) not found for architecture x86_64
$ # __tlv_bootstrap indicates normal TLS
$ clang -mmacos-version-min=14.0 tls.c -c -femulated-tls
$ ld -arch x86_64 -platform_version macos 14.0 14.0 tls.o
Undefined symbols for architecture x86_64:
"___emutls_get_address", referenced from:
_func in tls.o
_func in tls.o
"_pthread_create", referenced from:
_main in tls.o
"_puts", referenced from:
_func in tls.o
ld: symbol(s) not found for architecture x86_64
$ # ___emutls_get_address indicates emulated TLS
$ clang tls.c -c -femulated-tls -flto
$ ld -arch x86_64 -platform_version macos 14.0 14.0 tls.o
Undefined symbols for architecture x86_64:
"__tlv_bootstrap", referenced from:
_var in lto.o
"_pthread_create", referenced from:
_main in lto.o
"_puts", referenced from:
_func in lto.o
ld: symbol(s) not found for architecture x86_64
$ # __tlv_bootstrap is used dispite -femulated-tls being passed.
```
It happens when using -emit-llvm instead of -flto too. My guess is that the TLS model used is decided after LLVM IR generation, is there a workaround to use emulated TLS with LTO?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMlt-PmzgQx_8a52VEBCYJyQMPu8lFqpRepbZ7r8jBA_jO2Jw9JLf__cnkF5tuq3ZPp3aFNoFhvp6Z7wcH4b2qDWLO5o9svpmInhrr8ieT_J3yyd7K55wtYtJ-WrJFzNIHFm9Y_BC-D0d5PuepMqXuJQJL1x01DoWcNiz97bW4J6nsODr8L4pTGihDcBAOWLqBmKWP45sOVklg_KHqTcn48nIqXM34Clh2vhngHGR8FWLp9bqqhtBJ_rQCX12CcF03uaWg9ni7oevJM75knDtRIuM8pN_kHVLvDPz-tNvdKs824xZCe61Q5lbhuO7z7AqCjpQcF24I1N1MAI6N0hg6CqE1JPFLuYta6VAQDnUvBl2-PtXI13Aa5eV83AyAYvwxHLdr12auvcavNHrBY9z3x96ANdCK8sOnL0G6cDKDUgtTQ9S2orQ-OqDzypqoVYalm2Q2jWGgEaLylqIlRMKVDfyzXBSLGUSdFlRZ1xbndBjEYEi_atiTwJORWCmDEvxzu7faQ2UdBDlFWFLv8Cx7LRoY50VB-lDsrSVPTnQDCGtwWKFDU6KEytn2ljH8FYEuZcaLD1L3Ln2PVCDoXuskNgD6PRLB-DsJLVn6cJ4D40sfaDKWoLK9kV-dy9UHxlO4GwwoI1UpCD0Y61qh4fPu0xvMhqjCtteCUEak_c_z_mR-gW1P2hc1UiGkdOjfPvRvRX4cj1-ZjFemNuLj4u9rhHwFA4gqTfZnw_D2nUCT_S9ev9wKvhT7YcNHEv_HVuCh9yhBKt8pwnsv96hMDZ3wHuX0Gz8k7wga0XVoPBwbNND7kBdhqyjS-tCCMp7Ci4StTnwAWTsFeP8MdT8g54EaQUANBtagtRL1qTTlQWKpJEoQFaGD3e6P9_DuI9Ro0AlS1oRxDgroEAQcrftLuGEoZIPIC47hqKiB3ecPLN1OZJ7KVboSE8yTLOU8XvL5bNLky2SG-3mWSCmzrOSyyhbLfZzF1QzLKstmE5XzmM-ShCfJYp6l6XQp5jJdcDFHmWAikc1ibIXS09D_1Lp6orzvMU-SLFnxiRZ71H54x-N8eKACFvPNxOUhIdr3tWezWCtP_iZBijTm6-H5U7WxDv29ZdbARrijMtc-AY3Ya5ST3um8Iep8YI1vGd_Wipp-Py1ty_g2rHL-iDpn_8SSGN8OVXvGt-fCDzn_NwAA__9izjdV">