<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/59031>59031</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Error in pointer calculation for ARM EHABI bare-metal in libcxxabi/src/cxx_personality.cpp?
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
ayoussefi
</td>
</tr>
</table>
<pre>
Please note that despite the comment (which appears to be accurate in our ARM EHABI bare-metal implementation of exception handling), the "#if defined(LIBCXXABI_BAREMETAL)" case **adds** "offset" (which is the value of ptr, an absolute relocation) back to ptr itself, thereby generating an incorrect address. I believe this is a bug? In our implementation, this generated an illegal memory address, and the address of offset/ptr was correct by itself. The term offset is confusing in this case, as it is a direct address and not an offset.
libcxxabi/src/cxx_personality.cpp (lines 342-360):
```
#if defined(_LIBCXXABI_ARM_EHABI)
static const void* read_target2_value(const void* ptr)
{
uintptr_t offset = *reinterpret_cast<const uintptr_t*>(ptr);
if (!offset)
return 0;
// "ARM EABI provides a TARGET2 relocation to describe these typeinfo
// pointers. The reason being it allows their precise semantics to be
// deferred to the linker. For bare-metal they turn into absolute
// relocations. For linux they turn into GOT-REL relocations."
// https://gcc.gnu.org/ml/gcc-patches/2009-08/msg00264.html
#if defined(LIBCXXABI_BAREMETAL)
return reinterpret_cast<const void*>(reinterpret_cast<uintptr_t>(ptr) +
offset);
#else
return *reinterpret_cast<const void **>(reinterpret_cast<uintptr_t>(ptr) +
offset);
#endif
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy1VU1z4jgQ_TXmooIyMjhw8AESMjtVmdqtVA5zo2S5DdoRlkuSk_Dv90k2AfIxu5d1uQxyt55ed79ul6Y6Fn9pEo5YYzwxvxeeVeRaFRfEpDkcqPEs4YuXvZJ7JtqWhHXMG1YSE1J2VsBXNcx0lq0ef7DNH6v1d1YKS-MDeaGZOrSaAorwysCvZvQqqY2LvWgqrZpdwpcJv41HJpwnPFM1eNSqoQpHP3xf3_78CdjtevW4-bF5Wj3EDZzJQD3hK9yiqlz_L0CYunbkg8sbdeUi_rPQHQUWrbfhTNEwUTqjO4RhSRsZaQIfMchfIVA4MuUd6XrgaKk8sh01hNhBPkCoRhprSXoGHpacmzCGLJBW9BxSicNxC1Z2uyS7h61P2HVuenj4DdhURWitaYc8Huhg7PGE31OvYkjDqxDUKe77QPpFOHaiBcZ9DCD2hD2e7GHwDsykaerOhWBQysghpDYeAua-J1-pywjj8ZBN4NgDTZL0LklX_ZNpVcrXV1EqsHFW4onltiXrTCO08seJbNtQHgiAHMtmfJzlaShstroESvCyv_vlO3Fsz-qA_LZRfgEkOruQWBmic549G1UFeVgS1dYLuyPPt1EOgLl2idoYMJKb9RARrk41HsatP-Uuye6CAC3BQLa15LfInE-y2x7xbUPQZrbBSQN2doGKgGBI-PRUvuXZFi6gdrZh6dUmJBR3EHtsu9B1rTXPCv2LWj2tHr9tnviFpIOUYZNWlbG50Tn-2IJ3bT6AtiaGAxUHrSBhqBnUHPWBgmttXmI3KYszSSpgOTqIBskeZsMHSFSMIMUqmINoUfVfZCfs3tjLaQHTkcVowcC8teYHuHNcrscAXvf6fvu3P5_Gj5uHK-8wYN6j7b1vXdBdXO6knOyabmIsBtP9Qfevxq3wEmnDiqfpcpwugtHt0pTns8new-9TgX4xvd4oDMX9UkGDJnvxfOJ1VtiFvBDY-lpD_3qdtXdSGSIh7egD1d_pPbAdJvL_zvhL0k2l6lPz3n06RUZUTPN8kU_5bJGPqiKrltlSjLzymoqNtRAUBuHQBpiFWna676LafPWda_7byMP8H3VWF-80p_y-Kyf44GKh9fPpZ4ye_htTF0vlXBflN1-m2XS0L7Iyz4jqckH5zazkopIpr2c5zZayym4EH2mBL5Arkvk6md-NVMFTzqfTaT6d80WaTxZzTpko63lFCy6WPJmlaGKlJ-HgoP6RLSIHfLUcjFo5785G4ZzaNUQnfNH5vbGFOJrOOch_FAkXke0_DpKkQA">