<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/106887>106887</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Clang-Cl __declspec(naked) inline assembly fails with __declspec(dllimport) while MSVC succeeds
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          higher-performance
      </td>
    </tr>
</table>

<pre>
    (I'm not sure if this issue is 1 bug underneath, or 2 bugs.)

[Godbolt link](https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXAEx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApJIBCZ86SX1kBPAMqN0AYVS0AriwYhJAZlIXABk8BkwAOW8AI0xiPQAHVAVCRwZ3Lx9E5NSBUPCollj4rhtMOwcBIQImYgIM718Asoq06tqCfMiYuL0FGrqGrNL%2Bjq7C4okAShtUT2Jkdg4AfWWsZFoFBMxkCHRaWjwWJLqpgGoAN1Q8dDPo2ogpk39LDQBBE3fV9c3t3eYANaYdDnK43M78VCPT4fADsrzeZyRyKRqyYChYMJRKJM8Kx2IJKJYqAuZ0wTFUpDOGnxhMJxNJmGilOptLp2IZZOQLJp73Z9JJZPQPLZ/KRnMwKSpvMRYqJguBeGlorF2mOd1qKqRuIAIjDdRwZrROABWXi%2Bbi8VCcVxWKxnBRzBaYM5mfw8UgETSGmYAkD%2BABsADoACwaEOwqSSAMATg0AA5JEn9JwQ%2BbvaRrRxeAoQBpPd6ZnBYDBEChUMc6HFyJQ0JX6PENoZgMsCMRPAwAXw6AQ4rmINEM9EwrUAJ6cD3D5jEUcAeWi2h2Xo4WlIdbYglnDFo45XvCw0U8wFcYk2E/3mBYzfEe9I%2BGIS7wF0lGcwqh2nl75/IgnKGcO0TEGO7hYBmbZHN%2Bz7ENEySYDql7XmEoB7jMVAGMACgAGp4JgADus7bBaHr8IIIhiOwUgyIIigqOot66KUBhGCgdoWPoeDRLmkAzKgCSVAwuYcAAtEJ6DEE%2BcRCcSWDPDqGxnEJTbMVJ/iSApuFWlB4lYFxjwtI%2BTgQC4Qy%2BKUIRhN0RS9KUSQpPxJnZHZaTjD0JT6fYbQDPUHiNH05QGQw7R1C5VluaMgw%2BcMNheSFkxcDMjrzIs0wphwZqkBaq5ZmcqjxgGQkBiGZxKcAZwQG2HYAucEC4IQJCugE8W8MuWhTDMCDklg8R6X6XAmkG/j%2BBosIhv48awjGEbRjGsKpWmpAsCAJoaANJrxho/hxiahVrSGGUZlmOZ5gWKGkMWZZzAQCSfjWEB1gkVbEBErBLLl%2BWFcVTGleV7adlMvCKkQ2l6CRwiiOIlGgzRagZgxpC4UBCTnkaprpreWazp%2B10EGcqBUDleUFUVJVlRVf1le49ZxA17r/SdrXtZ1vR6caHDzYtIYxkGhVcDGAYaJN/gmiGXABvt6OcEd%2BYtT6pB%2Bu6A1cFwiaje6eX%2BJzqX%2BGjWWS/ThpnaW50QEg92PbdZsNiAFzIAkCTLBcvPLAYvb9Msb3drQvbEP2g63lOY7fgHM7zou9jfuujAEFuO4ZgeR4ngcgkelgV5GDeq73o%2Bz6Caub4fl%2Blo/r2rOrgBQEziBSyruBi1F1BMFKPBafAIczGnWhTAYdheEEYw36g2REPSFDSgw/R/r6M2LEWFY7GcfAPF8WkgmaXE2kvtx7n8c4DBuJFplBHvsXWaQtm5OkB%2BORfJ9hf5HlVF5DkjPf/FBZ0FkTKf4XeZkh8/7fFKiVnQpVZulTKVpOAEwDGcFgCgbaXF5kGF2kocY1XwEDGmTV9ZtTln4fwQZYQJndBNeMnMAzRnjIEVm7Mlr5ggZmPWuZpaFkNvAE2IBLrYwthWB6DZnpsE4KoD6cCEGOy5ig/oAMMEkBuCDWQQ8KIj1kNDOiq5dCBARkwJGloUZpR1pAjgmMrqflxvjN6sD4HIEQRIpgrs0GUz4dTN0/g6Yy1wR1JgXVKB6NoctcWutsw2GOu430/pJBBkkFQkMAZBoxi2qNRinBtYBMMc1QsejJAGMYUE0JpAoIpCcCGIAA%3D)

If you call a `dllimport` function from a `naked` assembly function on x86:
```
__declspec(dllimport) void bar();
__declspec(naked) void foo()
{
        __asm
        {
                mov eax, 0
                mov ebx, 0
                mov ecx, 0
                mov edx, 0
                mov esi, 0
                mov edi, 0
                jmp bar
        }
}
```
this causes Clang to attempt to pick an unused general-purpose register to load the associated `__imp_...` symbol into, **before** the naked body executes.

1. The fact that Clang even _attempts_ to do this is **itself** a bug, because `naked`'s entire purpose is to avoid extra instructions from being inserted into the function in the first place. This causes registers to be clobbered that the callees don't expect!

1. In the above example, Clang's attempt fails, because it fails to find an unused general-purpose register. (Whereas if you comment out one of the `mov`s, it succeeds.) It therefore errors, when it shouldn't:
```
<source>(5,9): error: inline assembly requires more registers than available
    5 |         __asm
      | ^
```

In fact, MSVC compiles this entirely correctly, as intended:
```
?foo@@YAXXZ PROC
        mov eax, 0
        mov ebx, 0
        mov ecx, 0
        mov edx, 0
        mov esi, 0
        mov edi, 0
        jmp (null) PTR __imp_?bar@@YAXXZ
?foo@@YAXXZ ENDP
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMV9lyo77TfRpyQ00Ky2y-yIXEFnCwDV7hJsUiFiMQZjG2n_4rcPKbqflnqr5UKhGtRt2ndThSB22bpxXGb4yAGEF9Cfouo81blqcZbn7VuEloUwZVhF9CGt_fGCCbDJBKtqId2_YNZvOE7bK8ZfO27TGbt-yMDfuU7asYNxUOuowBCksbFozm9pUBC4ZTGQ5-_RWQQeOQko4leVUwgsoAOeu6umXmkAE6A_T0Of9Km3QyzB_MHK69jzSDOrrEgqPcoDdsPGQrJXJj9AH1maNEMNhoCrQfA-psKEFn0DvbQXfopotl53gavLd5yDknqN1khOCSomoH4R6-1wO0r1D3dtvOSmeqCWvLRIovi9vTrEAbaF9WHPQOWw42-eBlFvSJeYKokFExwPVRhiZ3yzcOfD_Ag-IO_vzjttCE1RbtNwol5Mw3WWevhwiZjll6qWlLMxm29MKJ3UVJ7NzrPzjdaC5Gs_pggADQ-SIpPC3gNuv2O2AVccrD5HhsfZ3qyL4VyrsbHM_D0fq41KlB4WrmyLG6oYCmdTFffKgOQto8OSyieTfHHlwFXqxWS35uS_JB2ez4BKpt88D-3b0v3cvdUzLPttylZcvLGzCtpeVdYO9zw07f1-raqG6Zbd1WVmnkZF13HzUwfX_tfFi1NPcXluVvnM2HzwB96Vb2sNzWV9v1LlbaI2wQ2uigXMezy_Li9iY0z2rsDn7jriE6nvIJb5jLByU63I7LW4XcBwo8WyiTQd6n2m5rlB4s1MkPohaqFCpDoK2Hy3YLbbhLOQgFS6sW1uA8F7sGbuPeMKQOqjex6FfIU5GmZHs7Et_1u-Vw1kncaCvqp3ar2O4GDvA0iNDhm9JcafZCG5o9tMRInavCWdtHEB9zkIET5Y_EjEMvJZWqU144XZWB28uDHnkF0Bigz0vkPRINL8wpE8PcSoPOESMaLhmoiCQwQDfTamlEa26nGWsp81AZ-u-ryf0haSvtvvXUC5FOpUaRdLYP0LChkkKj5q0Uqn0rhSh4b2TTNLN8PezTu2nm6WVNO1Fc7lFmKGlMjxuKVfejLOBjmSrbAxx6L4Kw0yxR1bQpVuQq0faobtSLcas0axfaB4sBer6Fda8fCeKJp9_OQ_cEsksdhXfu03i5N91sxbnbxXK_derNzar8dz_YnVXO2omJFzrqZv-er945wTGcQXJninAgfWCnwzOyvcrwVi9ukWqfm4fZckOdDf6lQMFF8Mvocr6lhlOg3PBvywj6g2OAdw_2kabwpmMpfarJR9nuj9lOtRW1IKnsiifxBMvCYIB-noIg2prZlZeD4WxooXs22mV9LGvYKtCiAVxZzS2jDNCzWx5kh2ZrGHuflGtfSI9Lo7CPvv-AjrJNzkcNzdLiEGpIa9DHB5lWP-rRYWcQfJCCmNhXZVk4gIiKO-T52iRG-nCD1E9vtcLvkbKriqBu6gYfg0c9vT7jNCO6oL1K8F7fH6wDcQ_JjGB-4d_gTGoYoG_j5tT5s6srRsG7-vA607sVRnaIVAN6gbUaRbLMjRNE105cR1o8Lex1O7FG07AX4SzShzw4YxGfJpP1uDwHxvl43DJA32V1FRwFztHSBdiEsd-ucqg_TFgouw8UXTcf0LuGC7sN53HjXENtA1JxTtaelKTvtvSg_eKc9P0Zanq_5v0Uu3yVRmmBSXoQDBVfpDl9EltUgj7kk2f1yFj4BjTrJkWO9sjR9t70KJ_pM2Tryw0KEmhGD6M6ZjvoxRnWNG-Yiylwtc1WV7cjjXR3XEK0wYd21D3JiBK40eVjkZbBSQPFtbtJlRzxKuotvSbo_dqejoHTlcK6eJZn7SbWIkuEd3LQBbU4bxIG6DryOb3YLRP-hP0ikxmgS4m-zA-VUx_8nuyWh3oNtUE1Ij1V0jA46UJh6KCgkTc7DZpqlLvDwu92pOKTwfE9x6pitMJ2ZcOHW51N7VBKNmmENPXLzbH360AvVleoARN9NN7QZUckqn5Vtxq_pKoYKZqxvgv5eAhSaNtagXpFPTqOvDTPs2KlrvOLECsIusVgGYTu_dqd1fCclnZzScjtel6Jrcq_m5rjmnXatJyxf_DxbsWN9BG9-2xwZ1Z6OiyRuKJRFx37rh2Ase75-ehSWwgVhe4UNvQRveXgsnLzCnUesu1o5rT4bEHD9vYaZ9WQmrUSKYYJIQOEufrXoW8m7J32bBQQwgYsI3IxIXlZ06ZjRI5N-irqclqxSUPL53wVFDge54K2xWVI7r-daMXeZHG8LDwDiNzX7_T4-RnjiLQ1jhgg_44CFuyV5jEbBg0D5DG7OfrhhWfYb-eE0i_nZyQJfWNafH4Gbfnf058zDLco6ZXFwW28BnH_Yw__YY_-YY__YW_zf_j_r_1c1hPw3-mq34jUH4s4Xe-ioG9xyyokqFK2o2zQdbisu3FY51HBBhXbV32LYzbFFW4C8qvum5q2mG1wmrcdbkZXQoOY7TI8biSN8qDD8bi_n595WX--vr6Oe9zey5ASNq86OubOAMgAGOKENvg5nhaY9oYd76QsvuGo73D7-ifHZq_sLsNsEkQd22VB95U5vuKK_fxKvv0cc4rp9wX2K1betZgkX7GC8do65hHiqQR_0pEBUsviqssbzH6jzdupOhNj8K1rAjav2q7pJ7a2T06HOK_S0Y6bsQAj0gnTf6TOq-dz3rQdW5MgwiOa37vwXdIpVojZiNAwxA2On1DHd8ePC-OWjWnFAKlj8a3GUceA2V9FMp-hgpBeMYtvQVkTPMKdyjUB_N7pJMhJ-2cl8i_bmESSV_H_gwOvLAPkY4YbHLRj5zDJAC1LXHUs7TuWVpilyZQRI3IlvTIiN8XMx24jijCOpxaCNSeUzcQKFjcNbSa3IcPV5JvRnsQT8n9JAzNXWto3EWbmGgNkgQHKYlIC-FxvHOQVySv8W3UafOnzBrdsOYb9YxeyoGKDa5CTICT4uT7LsqzAMpLCfv_8oRJPwzjJCNrP6T2VspoYPEKztwdlrFWdE9w-GfukHrmzEW0aHHXkPjqOla06XMU4_jd2fVQznmN4zoOnk89u3LXynyL8qFg_ytWPWvWjUP2oUj9K1KhPo_j2hIw7vdm57FMfmLk-6tbvrP8FRlupm79wv8Rv83gxXwQv-G0mAWEmcTOJf8ne5CRaiGKAYwHPpHi2ABLgwyhI5DBahEnMv-RvgAM8t-BmnCCIM_6V5yNZEDhOlng5AdGc4TlcBjl5JeRajl3qy9QKv804UZalFxKEmLRTew1AhYdno8wAMHbbzdv40q-xM2Z4juRt1_5epss7gt-mD_GXQtifj6a_Kfr8Ioe8y9h_H35DlhP8ZNT3V_XSN-Ttr8Y777I-fI1oyQB9zOrr36-6oedJTPQJS8sA_Qvs9Q38XwAAAP__EVAhKA">