<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/64353>64353</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang] arm-none-eabi: __attribute__ ((interrupt ("IRQ"))) generates superfluous code
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
rgrr
</td>
</tr>
</table>
<pre>
Example code for a Cortex-M0 device:
```C
typedef void (*VECTOR_FUNCTION_Type)(void);
void Interrupt_Handler(void) __attribute__ ((interrupt ("IRQ")));
const VECTOR_FUNCTION_Type test__VECTOR_TABLE[64] __attribute__((used, section(".test_vectors"))) = {
Interrupt_Handler,
};
void Interrupt_Handler(void)
{
__asm volatile ("nop\n" : : :);
}
```
gcc generates the following code which is correct:
```ASM
00000000 <Interrupt_Handler>:
0: 46c0 nop @ (mov r8, r8)
2: 4770 bx lr
```
clang does this:
```ASM
00000000 <Interrupt_Handler>:
0: b5d0 push {r4, r6, r7, lr}
2: af02 add r7, sp, #8
4: 466c mov r4, sp
6: 08e4 lsrs r4, r4, #3
8: 00e4 lsls r4, r4, #3
a: 46a5 mov sp, r4
c: bf00 nop
e: 1ffc subs r4, r7, #7
10: 3c01 subs r4, #1
12: 46a5 mov sp, r4
14: bdd0 pop {r4, r6, r7, pc}
```
which is actually not wrong but not necessary. Also it has to be noted, that usage of the interrupt attribute is not very common in Cortex-Mx code (as far as I know). Nevertheless the above code sequence could be the reason why interrupt handling with gcc is much faster than with clang if you are using the attribute.
Example with more text around is here: https://github.com/rgrr/playground/tree/feature/compiler-attributes-etc/llvm-games/attributes
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0Vt1u4zYTfRr6ZhCDoiTLvvCFY8f4Any7i27T3hoUNZLYUqLKHzt--4L6i9JNA7RAhYQWzTkzZw45HHNrZdUi7kn6SNLTintXa7M3lTGrXBf3_dMrbzqFIHSBUGoDHI7aOHx9-EKhwKsUSOIDoSdCp3FDh7_jMHf3Dgss4aplAYRtCTv8-nR8-fb9cv7l6_Hl-dvXy8u9Q8J2hG2DUXiLH5cue-hz69AY37nL_3hbKDRv5nC5cOeMzL3Dy2UIspWT_TBnz99_Ioz1YXY_hhC6tQ4-IgYOrbtcxqWXw-P_n0j6uElIenofdwjrLRaEHcGicFK3Q-x17-OKwmljlyyAxCcg2UgFAD5KcxSSZKd_qMuEW7i_XLht4KoVd1LhKE2rO5IeW8IYkPgw_b8TKTv9ZXeXPCohoMIWDXdowdXhpCilb7KthoNzq6WoQVoQ2hgU7u-OzOHnL8M3dHyAxMcfE4yfZgcAQANfgGQjKLS6g-khCQ35NfoKZhu2JIy7GcZGWJbRCZG_gjKf5DkeFcXbCgrdpyrtf5FLnhYzqc7buk8nezRJn8amH7MwKjPvzJQSLymbsLwoRkPbhZGweDtbJ5NuGzHZ91olo_1ktwl2dIvJZKWsseFzpJOMnuMZsR08U7rEqM8wfOLC0yWXgbVJZs9i1Keksz7h8E7LOCxHZSnA-nwZMRsjZpNxNGodCxpNvt5jCIuj2ZotGH5ELRrlzIvF1unu423rxOcFNdcLF85zpe7Qagc3o9sKcu_6WYsCreXmvgY4KKtBOqi5Bachx2Ax3EOu5g685RWCLvvafLsY58srhAo-r2juIHTT6BZkO9_0r0MVE7blFkpugFt4ht9bfSNstwb4ilc0rkaFdih_nuvr2DMs_uGxFWHmVRGoBQOD3OoWbvV9QacOJRHujJt0NYRLRVpovKih5NahCbm0w-JQg7KEu_bADYK3AdjHnpJaLxWd-liPbrQJ1_qrA260b4sQp0bTn57aua6vaXYm7FxJV_t8LXRD2Dl0RcLOneL3qscRdnYGkbBzidx5E96Ebjqp0DzMPOwDOkHYWalr81DxBi1h57fVgd-q2MfFLt7xFe6jzS6iNN1F6areb2gq8iwKMxYho8iLIt5kXPBtlGQ8Wck9oyymW8qiXRql6TrPRMTzcrfJSp4ndEsSig2Xah0IrLWpVtJaj_tNEqfxSvEclZ36v9n3LHNfWZJQJa2zbzAnnep_KfTqh_7HTfPQ6hYfkOcyqPcvGvGic1jfoSmV1972h2fljdp_siGB2SRsZ_RvobOwc59d0LhP8M8AAAD___6Rj2M">