<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/89615>89615</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Invalid calling convention used for passing structures to varargs functions on ARM64EC
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
julliard
</td>
</tr>
</table>
<pre>
On ARM64EC, passing structures to varargs functions uses the arm64 calling convention, but it should use the x64 convention, as documented at https://learn.microsoft.com/en-us/windows/arm/arm64ec-abi#variadic-calling-convention
Below is a short test case showing that a 5-byte structure is passed by value, but according to the ARM64EC ABI it should be passed by reference:
```
struct s { char a, b, c, d, e; };
extern void foo( int a, ... );
void bar(void)
{
struct s s = { 1, 2, 3, 4, 5 };
foo( 0, s );
}
```
LLVM generates this (structure contents in x1):
```
0: d2804021 mov x1, #0x201
4: 910003e4 mov x4, sp
8: 2a1f03e0 mov w0, wzr
c: f2a08061 movk x1, #0x403, lsl #16
10: aa1f03e5 mov x5, xzr
14: f2c000a1 movk x1, #0x5, lsl #32
18: 14000000 b 0x18 <.text+0x18>
```
while MSVC does this (structure contents on stack, pointer in x1):
```
0: f81f0ffe str x30, [sp, #-0x10]!
4: d10043ff sub sp, sp, #0x10
8: 910003e1 mov x1, sp
c: d2800000 mov x0, #0x0
10: 910003e4 mov x4, sp
14: d2800005 mov x5, #0x0
18: 52804028 mov w8, #0x201
1c: 72a08068 movk w8, #0x403, lsl #16
20: b90003e8 str w8, [sp]
24: 528000a8 mov w8, #0x5
28: 390013e8 strb w8, [sp, #0x4]
2c: 94000000 bl 0x2c <.text$mn+0x2c>
30: 910043ff add sp, sp, #0x10
34: f84107fe ldr x30, [sp], #0x10
38: d65f03c0 ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVlFv4jgQ_jXmZQRybCckD3kopZVW2uqkO2nfHdsB7wa7sh2g9-tPdgJNKIeKKhc3883MN_NNM9x7vTNK1SjfoHy74H3YW1f_7rtOcycXjZUf9V8Gnv5-K9jLMyLP8B4xZgc-uF6E3ikPwcKRO-52HtreiKCt8dD7-GSvgLtDwUDwroswYc1RmWgSnTV9AB3A723fyQhJiHO0n9lxD9KK_qBMUBJ4gH0I7x7RJ0ReEXntFHdmddDCWW_bsBL2gMirMsveI_J60kbaU_zG3WE4C6bEkjcaEXrkTnOpxXLMcDmJjLcIPw3nRnX2BNoDj9m6AEH5AIJ7Fe-nSC3seQAO-bL5COqzPhEUi6YkNB9w5F2vLtS5ENbJhLWJ-VhneNr8mNSlURMHTrXKKSNUZD9JEBV4_EnXITx4QOsNiD13wFPUeIh4yHgoRDeA1ltEN1Nf6hyUM3C0WkJrLSIlaBMGD6vVChCpbhDJtOEOkTJ-jQbD0_VoBgBwzckDotuUWRZdknjQeLB45LOMInDMAcenfh59vb1Lfzh__vz1BjtllOMhqVFHdPnZGmFNUCZ40AbOWXL8qKgwfDCiTyBJiRkmWfoLwtXBHhGuzokQIhSfCc5GFIv2VYYxpord2CfG_n3mv4z2hGctpgrP7U-pBqd_3QwgIqAlHJe4mCb0Z54Rw6nIne_iPSumPrJEig9B85sk8wg7z4NmbAgqMMb8QdB8EpKSmYfEM2M4fS4eGoQrfM5KQPR5FdQ5ILKJd0RfHnT6tNedgrd_fj2DtI9bbQ34wMWf9M_MahOU-277U43aMmtx26pLwj64yJimzqB8499H7kt8zjDKt4hks26lwskMY0bbNnnoI-kBd0Un8BdVjCq6q7obFYmLSqfVHe3xNQj-KoJvKXVo_-j-rl7uuE8U8mFwyhthl3cGZ0AlIutB3eWN0CawR-omiVhTJWLlvHOji9S4fDtDsUu-GPP_zzcfMSTRoxXG2TxIcxPlmvFtvMS0ugxEHIYuTQMRk2lgB5NGIlq_TOH02r0krDE-l_KhuOgwxyXL8PpT1J38Iuoo5LvKpIm3LPIWU5HSdircHaCFrKmsaMUXqs7WGV1XVUXWi31dUVnKRlVFXlWVyEtKG8bygrCm5UyVZKFrggnDjJAspwSzFalKTgrcMsqroqEUMawOXHerrjseVtbtFtr7XtVlVWT5ouON6nzacggxKr7IfXwNk7j0uDpilk2_84jhTvvgP70EHTpV_zBH3ml5Z4uJS0t8SbpvL0b2uk4tetfV801mp8O-b8YFJiYx_lq-O_tbiYDIa0o9bjOJ2n8BAAD__1pGm-A">