<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">