<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/72162>72162</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[OpenMP] thread_local destructors are called after static objects are destroyed
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
iassiour
</td>
</tr>
</table>
<pre>
The following code demonstrates a scenario that leads to a segmentation fault when openmp is used together with c++ thread_local objects. The code creates an openmp region with 4 threads, each thread creates a tread_local object. The destructor of the thread_local object accesses a static object.
```
#include <unordered_set>
static std::unordered_set<int> streamSet;
struct TLS {
TLS(){
}
~TLS() {
streamSet.insert(1);
}
};
void run() {
thread_local TLS tls;
}
int main () {
streamSet.insert(1);
#pragma omp parallel num_threads(4)
run();
}
```
clang++ -O3 -L/usr/lib/llvm-14/lib/ -fopenmp=libomp omp_tls.cpp
valgrind shows that the thread_local destructors are called after the run_exit_handlers function is called (that destroys the static object)
```
==1684205== Thread 4:
==1684205== Invalid read of size 8
==1684205== at 0x10949C: std::pair<std::__detail::_Node_iterator<int, true, false>, bool> std::_Hashtable<int, int, std::allocator<int>, std::__detail::_Identity, std::equal_to<int>, std::hash<int>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<false, true, true> >::_M_insert_unique<int, int, std::__detail::_AllocNode<std::allocator<std::__detail::_Hash_node<int, false> > > >(int&&, int&&, std::__detail::_AllocNode<std::allocator<std::__detail::_Hash_node<int, false> > > const&) (in /home/iassiour/SWDEV-430019/a.out)
==1684205== by 0x109419: TLS::~TLS() (in /home/iassiour/SWDEV-430019/a.out)
==1684205== by 0x4D11D9E: __call_tls_dtors (cxa_thread_atexit_impl.c:159)
==1684205== by 0x4D60944: start_thread (pthread_create.c:450)
==1684205== by 0x4DF1BF3: clone (clone.S:100)
==1684205== Address 0x5023118 is 8 bytes inside a block of size 104 free'd
==1684205== at 0x484B8AF: operator delete(void*) (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==1684205== by 0x4D11494: __run_exit_handlers (exit.c:113)
==1684205== by 0x4D1160F: exit (exit.c:143)
==1684205== by 0x4CF5D96: (below main) (libc_start_call_main.h:74)
==1684205== Block was alloc'd at
==1684205== at 0x4849013: operator new(unsigned long) (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==1684205== by 0x1096C4: std::_Hashtable<int, int, std::allocator<int>, std::__detail::_Identity, std::equal_to<int>, std::hash<int>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<false, true, true> >::_M_rehash_aux(unsigned long, std::integral_constant<bool, true>) (in /home/iassiour/SWDEV-430019/a.out)
==1684205== by 0x1095BB: std::_Hashtable<int, int, std::allocator<int>, std::__detail::_Identity, std::equal_to<int>, std::hash<int>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<false, true, true> >::_M_insert_unique_node(unsigned long, unsigned long, std::__detail::_Hash_node<int, false>*, unsigned long) (in /home/iassiour/SWDEV-430019/a.out)
==1684205== by 0x109550: std::pair<std::__detail::_Node_iterator<int, true, false>, bool> std::_Hashtable<int, int, std::allocator<int>, std::__detail::_Identity, std::equal_to<int>, std::hash<int>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<false, true, true> >::_M_insert_unique<int, int, std::__detail::_AllocNode<std::allocator<std::__detail::_Hash_node<int, false> > > >(int&&, int&&, std::__detail::_AllocNode<std::allocator<std::__detail::_Hash_node<int, false> > > const&) (in /home/iassiour/SWDEV-430019/a.out)
==1684205== by 0x1092FC: main (in /home/iassiour/SWDEV-430019/a.out)
```
The issue seems specific to llvm libomp library. The code runs fine when complied with g++ and libgomp.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWEuP47gR_jX0pdCGRMm2dPDBjxGywG52gWkkR4ESyxYzFKkhqXZ3DvntASn51a9xgsxMgG3ALZti1cePrBe7mLVirxCXZLYms-2E9a7RZin8e92bSaX50_K-QdhpKfVBqD3UmiNwbLWyzjCHFhjYGhUzQoNrmAOJjFtw2k_gvkXlmBNawY710sGhQQW6Q9V2ICz0Fjk4vUfXoIGDcA3UhK4JXYNrDDJeSl0zCbr6B9bOTsGzCRxqg8PyJziDe79OAElHdUvoBpDVzTg-q4F7AT-gc7TO9LXTBvQOXIOvMQFW12jtsH2_wfqIQaItiVZkHo2fYUgToWrZcwSSbHqlDUeDvLToSPJplAnPEcw6TpIVSVbPZDdCeQ2wnn372b9aX6t76nD_62cgi3EG_JDQjND84h1ZbC8VAf51krpQPa0zFcqicYRmscdJXsFZbJ-RedCCg-nVC9TrE_VknbRn5WtmQjlomVDwEuYGdjTpDNu3DHTbQccMkxIlqL4tTw6SpV5nVDjRfYXOtU1rydR-9NW73xO4-5XQoreG0EKKyj_lQ3sXp6cx3O0GTyXJVorKE9JtVzppp3XXXR0ck3sjFAfb6IMdwuqFI5791AIzCLXfGge2c2iCtOlViY_ClQ1TXKKxsOtVHWJR2KM4oVmAD2j6yQbNK48-Hc7rnp1sSbKN51lKo9kwgPsh1FLvwW8K_aIemPT-4UX1Dqz4J0L2tjwAMAfRYxzlab4hyeocIx0ThiSb07gsOTom5Dj6q-ZYCoeGOW3GEKIbcKZH_71j0qKPQrqBSms5hNcR6i_MNo5VEs-K49dJhklvkDP2APUWm184Kifc05UMfu2ZLJ1-HaFhtrkJ-zfNS8PUHkuvIrx7vi28xZCRBwUeNN4T_8OIFkuDXq7stBT103vip3MrnWHCWZJshoO-OPnwnXwCv6txA-UQyGWvxNf-nTN_ttrKm8Db-dINLu3yHs1SDYrjGkd_gIs_QrMwOw-fkc5x8FNI1b4ABwI5BHZAaNHoFgktjvWb0OLz37ef_naXJlEU54QWbKr7i4B-JcyqpzHG4tzHmK8JgdRldfgfLgcwrJhu43ibezeAsvSpyafFkofkRmhWP7IxX5fMhZwm2k5Oa5Ks4ll-4wrzKE_TIXEw40Y8j96N0MPdIKCms-hG1CJeF4lHraVWGMj6H1N_bnH0DZQV5wathehxFtEkjjOfmTOonvwVRSgrOAKDSur6yylHxlEKO4NI6IJ_O12mWbrOVoUnqLshBQJHiQ4JzXyBJnR1ZdRTBcNHrAktjrXI_9x3BqVmvGyxrRusv9yxls_TOylU_zi1-mZTp3k6mPpljSI08y8G28bJzZDzKGzS615jpDdibIrZNp97DEKzCqU-hGvHeDhSVHU5OE5wTz81bUiyWqTvw6-D8Q7MQgh9bzVg7ibD5VGcXBlO4YHQrFfh1s5Bap_hf6Tt4iifb9Kr4vtRIX9whRwXYP3jS1-4WE0oh3vDZBkqBfMnswnXmzPs90rmcZTP1usPL_m_uUcNl4lXvOVt97n9ShIKyAuo7-dZs-jj8v9ncNqPy_9Pu_zTIvyDfey6_Hf4z_oE4XnfIAhrewSL2FqwHdZiJ2pwGqR8aGHsi0hRGWaeLtp9plcWdkLh0EGsddtJgXzo9h3bMExxr7rXbTf24SZ8mfA8ydkEl_E8z_OYZvNo0izZgsdxkuc8j5AuKMN4RtmCxtGsindVFk3EkoYreZxQGkWzfMrTXUxz_6jimqURSSNsmZBTT3yqzX4SdrZc0HhOJ5JVKG1orFKq8DBsm1BKZtuJWYbeUNXvLUkjKayzZxQnnAwd2d87VL_9QWbb_6Dvc9W5GebHzg7ySW_ksnGus97VaEFosReu6atprduxX3VsW3VGD72fIvC2hBZhX_8OAAD__5GotVg">