<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">