<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/62717>62717</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            COMPILER-RT: error, pthread_key_t is not a scalar type.
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          carlo-bramini
      </td>
    </tr>
</table>

<pre>
    While compiling compiler_rt, I'm getting these errors:

```
/home/carlo/packages/llvm/llvm-project-15.0.7.src/compiler-rt/lib/orc/elfnix_platform.cpp: In function 'void* __orc_rt_elfnix_tls_get_addr_impl({anonymous}::TLSInfoEntry*)':
/home/carlo/packages/llvm/llvm-project-15.0.7.src/compiler-rt/lib/orc/elfnix_platform.cpp:498:30: error: invalid conversion from 'long unsigned int' to 'pthread_key_t' {aka '__pthread_key_t*'} [-fpermissive]
  498 | pthread_getspecific(D->Key));
      |                           ~~~^~~
 |                              |
      | long unsigned int
```

```
/home/carlo/packages/llvm/llvm-project-15.0.7.src/compiler-rt/lib/orc/elfnix_platform.cpp:501:30: error: invalid conversion from 'long unsigned int' to 'pthread_key_t' {aka '__pthread_key_t*'} [-fpermissive]
  501 |   if (pthread_setspecific(D->Key, TLVMgr)) {
      | ~~~^~~
      |                              |
      | long unsigned int
```

```
/home/carlo/packages/llvm/llvm-project-15.0.7.src/compiler-rt/lib/orc/elfnix_platform.cpp: In lambda function:
/home/carlo/packages/llvm/llvm-project-15.0.7.src/compiler-rt/lib/orc/elfnix_platform.cpp:527:23: error: invalid 'static_cast' from type 'pthread_key_t' {aka '__pthread_key_t*'} to type 'uint64_t' {aka 'long unsigned int'}
  527 | return static_cast<uint64_t>(Key);
      | ^~~~~~~~~~~~~~~~~~~~~~~~~~
```

The same errors happen in these files:

- compiler-rt/lib/orc/elfnix_platform.cpp
- compiler-rt/lib/orc/macho_platform.cpp

These errors are correct because the current code wrongly assumes that `pthread_key_t` is a scalar type, it might be true somewhere but on other systems it is not (for example CYGWIN).
I fixed the first two errors by applying this patch:

```
diff --git a/compiler-rt/lib/orc/elfnix_platform.cpp b/compiler-rt/lib/orc/elfnix_platform.cpp
index c087e71038..3c80a7a150 100644
--- a/compiler-rt/lib/orc/elfnix_platform.cpp
+++ b/compiler-rt/lib/orc/elfnix_platform.cpp
@@ -72,7 +72,7 @@ Error runInitArray(const std::vector<ExecutorAddrRange> &InitArraySections,
 }

 struct TLSInfoEntry {
-  unsigned long Key = 0;
+ pthread_key_t Key = { 0 };
   unsigned long DataAddress = 0;
 };

diff --git a/compiler-rt/lib/orc/macho_platform.cpp b/compiler-rt/lib/orc/macho_platform.cpp
index cb248aae06..8785d6a6b7 100644
--- a/compiler-rt/lib/orc/macho_platform.cpp
+++ b/compiler-rt/lib/orc/macho_platform.cpp
@@ -143,7 +143,7 @@ public:
 namespace {
 struct TLVDescriptor {
   void *(*Thunk)(TLVDescriptor *) = nullptr;
-  unsigned long Key = 0;
+  pthread_key_t Key = { 0 };
 unsigned long DataAddress = 0;
 };
```

But unfortunately I don't know exactly how to fix `static_cast<uint64_t>(Key)` issue.
Can somebody fix this mistake?

Thank you very much.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUV01v27oS_TX0ZmBBoiRLXnjhzwej7XsPbdDirgyaGkm8kUiBpJJok99-QfojsZu0SRe39wpCwoSc4Qzn8JwRM0ZUEnFG0gVJVyPW21rpGWe6UeO9Zq2QYrRXxTD7VosGgau2E42Q1XGEeqctoUvYEpq1UKG1btLWaBBQa6UNieckXJHw9HMSHt_Dn3RTqxYJ3fg9Cd10jN-yCg2hm6a5a4-_xp1WfyK34ygNwiALjObO5hjE2AWxacSe0I3yM9iUUjzsuobZUuk24F1H4jlsJZS95FYoCYRmd0oUhM5ht1Oa77TdHc1sY3YV2h0rCr0TbdcQmpNswaSSQ6t6Q7KVSyue33z8spWlWkurB0LnhE4JzZ4y_luTS6Y5iedx6PL0R-8GQt6xRhTAlbxDbVzepVatS75RsoJeegAUIKQlNAOr3FRna42s2N3isPP_dsnfMje1211Nzl3G2QpIuhiXHepWGCPukKSrwyEAJNMcSLaEk2GF1nTIRSk4oflqTOL1Bxz82U1JvDiZuceZvf48Pj6SdP34eLT48eKDt2vn3x_Ciyj9_dBNw-ifWd00jI4nL0ogND85MK9UeQk3H79-qvSh3m7v65pclfUNQPiX19bRUsPafcHO7PSbOCT17EXjF1FGaGYss4LvODMeOB5sdujwV2Fl1dm8F9JOkmvLl2Ds2PcEPr94CRptryU8Dy9enj3Ga0LzI8V8zy8ea688P0DMTY1gWHuSOahZ16EEIY_qV4oGr8VvDO8ryE-NWsZr9YLNOcSzDAPTTr61Rm5hj5z1Bl2kwHutUVrgqkC410pWzQDMmL5FA7ZmFsgkvCzfJARhgIHhrGHaV9Dda2GhFVXt3IPVPYJRLd7XqBH2vQUlQdkaNZjBWGyNWy8MSGUdbZRKAz6wtmsQln_859v2v4ROg0MeWyjFAxY-3FJoY8Heq1Ne-wFY1zXDoe8QBjpmef3jrqMQZQnjcSUssPfeEti_-175PYUs8AF4mGeYRWGcB0HM85BlLEpDiMJwkiTHeo_H74_qRBaLw_urQZIkJEkI44wSusyA0MVpdJhYuzMH3cutFHauNRsIzbmSxoKxxaEnukNuHXEs1w_Ie6v0vCj0ZyYrJPEaCJ2cbb-g5zpD6PIs4avnZQNjdc8tPG-znhRjDE_M4HniAw5A4hWE51vujuICu-c1JFtA6Pd7xgiX7lbMMhc7GnPl9sLunZD6_sr-pFiv3fEjoPY0yRnDcBIEeZanxYRN9tk7AfUqjbwRT6_aH-EUJfEJT-fhYarr943g59sKkrVoOsbxWWNwBsHXFRquRWeVvugbXBsPXlRyQuc3dS9vfXeRX5n4Bt2XUvZN01l9ruEbofR2LP0akl7SmUVvoZel0raXzGIzwBYKJQnNLNxKde9Yk9tmgFrdOz0txYNj7DdIoadx0-ORZZdMesZ2n3vei2fTVhjLbpHEm0tlYfIWBtXDHeoB2p7XwaiYxcU0nrIRzqJJnkRpmITZqJ5FYTItclrmZVlEPEqLrAgTnCRxVNJpnPORmNGQxmEapVEUxzQLJnnCQ57SpCySaVmkJAmxZaIJXKcTKF2NfOCzCc2ibNSwPTbGf8JSKvH-kBWh1H3R6pnvjvZ9ZUgSNsJY8-TFCtvgbPm_T__fflx_Hn--eep76PKq2EepulC9YNTrZlZb23mlpxtCN5Wwdb8PuGpfbtAI3fj4XP_m4_8rAAD__8b2w9k">