<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/88273>88273</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Objective-C++ Wrong Assignment of arguments to registers on Windows ARM64 when returning an instance of C++ Class.
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
hmelder
</td>
</tr>
</table>
<pre>
The libobjc2 `objc_msgSend` implementation for aarch64 expects the receiver and selector to be passed in x0 and x1 respectively.
On Windows ARM64, the pointer to the (uninitialised) instance of the C++ Class is assigned to x0, shifting receiver and selector into x1 and x2. This results in a crash.
This does not happen on Ubuntu aarch64, as seen in the lldb snippet below.
I am using the GNUstep Windows SDK from https://github.com/gnustep/tools-windows-msvc.
Here is the test code:
```objc++
#import <Foundation/Foundation.h>
class Bar
{
public:
Bar(int i) : m_i(i) {}
private:
int m_i;
};
@interface Test : NSObject
@end
@implementation Test
+ (Bar)bar
{
return Bar(42);
}
@end
int main(int argc, char *argv[])
{
NSLog(@"Hello");
auto pair = [Test bar]; // crashes
NSLog(@"Success");
return 0;
}
```
## Windows 11 ARM64
Machine Information
```sh
WindowsBuildLabEx: 22621.1.arm64fre.ni_release.220506-1250
WindowsProductName: Windows 10 Pro
OSDisplayVersion: 23H2
WindowsKit: 10.0.22621.0
```
Clang Version
```sh
clang version 18.1.3
Target: aarch64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Program Files\LLVM\bin
```
Build Command (Inside MSYS2)
```sh
clang crash.mm -o crash.exe -g -gcodeview `gnustep-config --objc-flags` `gnustep-config --base-libs` -Xclang -fobjc-dispatch-method=non-legacy
```
LLDB
```gdb
Process 6408 stopped
* thread #1, stop reason = breakpoint 2.1
frame #0: 0x00007ff738e61048 crash.exe`main(argc=867171612, argv=0x00007ff738e640b0) at crash.mm:27
24 {
25 NSLog(@"Hello");
26
-> 27 auto pair = [Test bar]; // crashes
28
29 NSLog(@"Success");
30
(lldb) di
crash.exe`main:
0x7ff738e6100c <+0>: sub sp, sp, #0x20
0x7ff738e61010 <+4>: str x19, [sp, #0x10]
0x7ff738e61014 <+8>: str x30, [sp, #0x18]
0x7ff738e61018 <+12>: mov x0, #0x2c ; =44
0x7ff738e6101c <+16>: adrp x19, 2
0x7ff738e61020 <+20>: movk x0, #0xe000, lsl #16
0x7ff738e61024 <+24>: ldr x19, [x19, #0x5e8]
0x7ff738e61028 <+28>: movk x0, #0x66cd, lsl #32
0x7ff738e6102c <+32>: movk x0, #0x9197, lsl #48
0x7ff738e61030 <+36>: blr x19
0x7ff738e61034 <+40>: adrp x8, 5
0x7ff738e61038 <+44>: adrp x2, 5
0x7ff738e6103c <+48>: add x2, x2, #0x10 ; __start_.objcrt$PCR
0x7ff738e61040 <+52>: ldr x1, [x8]
0x7ff738e61044 <+56>: add x0, sp, #0xc
-> 0x7ff738e61048 <+60>: bl 0x7ff738e62384 ; objc_msgSend_stret
0x7ff738e6104c <+64>: mov x0, #0x803c ; =32828
0x7ff738e61050 <+68>: movk x0, #0xbcf9, lsl #16
0x7ff738e61054 <+72>: movk x0, #0x1e3c, lsl #32
0x7ff738e61058 <+76>: movk x0, #0xa7d7, lsl #48
0x7ff738e6105c <+80>: blr x19
0x7ff738e61060 <+84>: mov w0, wzr
0x7ff738e61064 <+88>: ldr x30, [sp, #0x18]
0x7ff738e61068 <+92>: ldr x19, [sp, #0x10]
0x7ff738e6106c <+96>: add sp, sp, #0x20
0x7ff738e61070 <+100>: ret
(lldb) register read
General Purpose Registers:
x0 = 0x000000e233affd1c
x1 = 0x00007ff738e640b0 $_OBJC_CLASS_Test
x2 = 0x00007ff738e66010 __start_.objcrt$PCR
x3 = 0x0000000010000000
x4 = 0x0000000000000150
x5 = 0x000000006d9d3bcf
x6 = 0x00007ff8b4129000 NlsAnsiCodePage + 26720
x7 = 0x5d4b1dcd6d097720
x8 = 0x00007ff738e66000 __start_.objcrt$CAL
x9 = 0x0000000000000000
x10 = 0x000000007ffe0380
x11 = 0x0000000000000000
x12 = 0x0000000000000000
x13 = 0xa2e64eada2e64ead
x14 = 0x0000000000000001
x15 = 0x0000000000000070
x16 = 0x0000000080000001
x17 = 0x00005859193355a3
x18 = 0x000000e233970000
x19 = 0x00007ff857942570 gnustep-base-1_29.dll`NSLog at NSLog.m:293
x20 = 0x000002a841621080
x21 = 0x0000000000000000
x22 = 0x0000000000000000
x23 = 0x0000000000000000
x24 = 0x0000000000000000
x25 = 0x0000000000000000
x26 = 0x0000000000000000
x27 = 0x0000000000000000
x28 = 0x0000000000000000
fp = 0x000000e233affd30
lr = 0x00007ff738e61034 crash.exe`main + 40 at crash.mm:27
sp = 0x000000e233affd10
pc = 0x00007ff738e61048 crash.exe`main + 60 at crash.mm:27
cpsr = 0x80000000
(lldb)
```
## Ubuntu 23.10 aarch64
Clang Version
```sh
Ubuntu clang version 18.1.3 (++20240322073236+ef6d1ec07c69-1~exp1~20240322193248.98)
Target: aarch64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
```
Build Command
```sh
clang-18 ObjcCXXObjectReturnTest.mm -o ObjcCXXObjectReturnTest -g `gnustep-config --objc-flags` `gnustep-config --base-libs` -Xclang -fobjc-dispatch-method=non-legacy -fuse-ld=lld-18
```
```gdb
* thread #1, name = 'ObjcCXXObjectRe', stop reason = breakpoint 2.1
frame #0: 0x0000aaaaaaab0dcc ObjcCXXObjectReturnTest`main(argc=<unavailable>, argv=<unavailable>) at ObjcCXXObjectReturnTest.mm:27:14
24 {
25 NSLog(@"Hello");
26
-> 27 auto pair = [Test bar]; // crashes
28
29 NSLog(@"Success");
30
(lldb) di
ObjcCXXObjectReturnTest`main:
0xaaaaaaab0d9c <+0>: stp x29, x30, [sp, #-0x10]!
0xaaaaaaab0da0 <+4>: mov x29, sp
0xaaaaaaab0da4 <+8>: mov x0, #0x2c ; =44
0xaaaaaaab0da8 <+12>: movk x0, #0xe000, lsl #16
0xaaaaaaab0dac <+16>: movk x0, #0x66cd, lsl #32
0xaaaaaaab0db0 <+20>: movk x0, #0x9197, lsl #48
0xaaaaaaab0db4 <+24>: bl 0xaaaaaaab0e90 ; symbol stub for: NSLog
0xaaaaaaab0db8 <+28>: adrp x8, 17
0xaaaaaaab0dbc <+32>: nop
0xaaaaaaab0dc0 <+36>: adr x1, 0xaaaaaaad12b0 ; ObjcCXXObjectReturnTest.PT_LOAD[3].__objc_selectors + 0
0xaaaaaaab0dc4 <+40>: ldr x8, [x8, #0xd0]
0xaaaaaaab0dc8 <+44>: ldr x0, [x8]
-> 0xaaaaaaab0dcc <+48>: bl 0xaaaaaaab0ea0 ; symbol stub for: objc_msgSend
0xaaaaaaab0dd0 <+52>: mov x0, #0x803c ; =32828
0xaaaaaaab0dd4 <+56>: movk x0, #0xbcf9, lsl #16
0xaaaaaaab0dd8 <+60>: movk x0, #0x1e3c, lsl #32
0xaaaaaaab0ddc <+64>: movk x0, #0xa7d7, lsl #48
0xaaaaaaab0de0 <+68>: bl 0xaaaaaaab0e90 ; symbol stub for: NSLog
0xaaaaaaab0de4 <+72>: mov w0, wzr
0xaaaaaaab0de8 <+76>: ldp x29, x30, [sp], #0x10
0xaaaaaaab0dec <+80>: ret
(lldb) register read
General Purpose Registers:
x0 = 0x0000aaaaaaad11a0 ._OBJC_CLASS_Test
x1 = 0x0000aaaaaaad12b0 ObjcCXXObjectReturnTest.PT_LOAD[3].__objc_selectors + 0
x2 = 0x0000000000000007
x3 = 0x0000aaaaaaad2010
x4 = 0x0000000000000004
x5 = 0x0000aaaaaaebc7f0
x6 = 0xb3c97132ac52cb5b
x7 = 0x0000fffff7e1f3a8 ._OBJC_CLASS_GSMutableString
x8 = 0x0000aaaaaaad12d0 ObjcCXXObjectReturnTest`._OBJC_REF_CLASS_Test
x9 = 0x0000000000000000
x10 = 0x0000fffff7f884cc libobjc.so.4.6`objc_slot_lookup_super2 + 264
x11 = 0x0000000000000003
x12 = 0x0000fffff7f87bd0 libobjc.so.4.6`objc_msg_lookup_sender + 100
x13 = 0x0000000000000003
x14 = 0x000000000042a2d5
x15 = 0x0000ffffffff8b88
x16 = 0x0000fffff7fb00d0
x17 = 0x0000fffff76d47f0 libc.so.6`free
x18 = 0x0000000000000034
x19 = 0x0000fffffffff0d8
x20 = 0x0000000000000001
x21 = 0x0000aaaaaaac0ed8
x22 = 0x0000aaaaaaab0d9c ObjcCXXObjectReturnTest`main at ObjcCXXObjectReturnTest.mm:24
x23 = 0x0000fffffffff0e8
x24 = 0x0000fffff7ffdb90 ld-linux-aarch64.so.1`_rtld_global_ro
x25 = 0x0000000000000000
x26 = 0x0000fffff7ffe008 _rtld_global
x27 = 0x0000aaaaaaac0ed8
x28 = 0x0000000000000000
fp = 0x0000ffffffffef50
lr = 0x0000aaaaaaab0db8 ObjcCXXObjectReturnTest`main + 28 at ObjcCXXObjectReturnTest.mm:27:14
sp = 0x0000ffffffffef50
pc = 0x0000aaaaaaab0dcc ObjcCXXObjectReturnTest`main + 48 at ObjcCXXObjectReturnTest.mm:27:14
cpsr = 0x40001000
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8Wttu2zi3fhrlZsEGSZ0vchHbzczsP22DpnPYVwYlUramsiiQUuLui3n2DVKibZ0ctxj8RuHK0uK3jlwkv4gqle9Kzu8df-X4mzva1Hsh7_cHXjAu7xLBvt9_3XMo8kQkf6cEnADpi-1B7V54yZwAQX6oCn7gZU3rXJSQCQmUynQfeMCPFU9rBfWeg-Qpz1-5BFoyULzgaS0k1AISDhVVijPISzgi8_yIQXKlB-evvPi-dNDGQQ_t9-cS_sxLJt4UPHz5GHgOWRsFlcjLmhtI_dMhUVPmZV7ntMgVZw6JIS9VTcuUg8iMzNohK4esYF1QpSBX0MWDaZAj0shqn2d1Xu5m7M9LLYlbo8kSvu5zpU1vilppfyikkqp9zwEjwwRXUIoa9rSqeAmihN-TpqwbGzytnCpQnJcaSJtbFCwBVeZVxWtIeCHeeri_AT1Ao7SxWvqXT7-rmlenYL1s_gOZFAfY13WlHPfBIY8Oedzl9b5Jlqk46B9lo8c45LEWolCLt3bs4qBe056uX7nkOmBaUc1VDalgXGO2MgFq_-laaWPcPSBufqiErMFx14-iKZkpGoc8nn8s94774VJXarKzorK7GXZgVZMUeXpSCgBGiER5WUOu8-24D3DY5vqW-RmunHDTDZb5K615b7Qep8Vda224OV-33x4yRZbRlMNX7bdW8enlc_I3T-uTjJ4Zg1H9SaKH9iTIShesMT9ORp46KJa8bmTZOegRh8Q9M_vaBvqNXzQvu9BQuUt1daV7KsEhD1TuXtv5r1FHmj-9PImdQyLHQw4hv_KiEA7pG4Di0wVtagEVzSU47gYcf2WipF3ydTChLbp2VnDVs3uo6qVJU67USFk_Img2DrYI--O6MnSIe5oZGHed5ELkI033ecnhtzIT8tBWaR9W7dsbHcqqyQv2RJMPR10ShAQEL_GSykPgZZIvy3wrecGp4ktCkI-CBSY-6iE8S8GatP5ED7osz9YheJai630vm1xVBf3-B5dKm6RVub-SHs5_8lrfx2iJlq0d6EpE1gUtd2Dxpl1MjcxrKwM4WuKl2_UyKnfcqOva1qJKe13DtjzJKYODYLzQwpVQ-bHrWronFwVnm1zqR2s9Jf31sxQ7SQ_wmBdcOf766emPj46_TvKhjePsmkzAWhwOuis7JPqtVDnj8PHlf1_IucSnnWzb9eEAC9Fd8yOHxQ4WO93iXnP-phfBrlEuUlFm-Q4WC93pFllBd0qviVMSCVV8UeSJEVj81apbZGYgy1VF63S_OPB6L5jjbkpRLgq-o-n3K_4-PW1Wg8c7lrR3nqXQswcCD0WgalFV3DYF8gB1mxCHuNiscrWoQHKqRGnmbSI5_WYWVCBLfO6QmaQHvbS6SKcKHRFCKMyy0I14gJEXnUPmBKhrOabduJsoCHGIA0zMwqZbjrvpA3goQbpN0_qUBcd9IOFJPfEA4NSa9A0fzp_3-5QeEbSXC8f9ACS8GP4zjUsDRufLGG5pYADg2iySSK_p2mmWd1U4DOBpgULHc6RRqhdQh6yQXitdjamaRLuhKpNP863zdCTonL5LCIw6CO8MUUs44tgM9VcXGBjpIEzDeB1M1IMBgKOLJpCiM1IPJupgMLE4B_FqYNDZFe31SufH82assXHBQQdDmaw0SusWmR5GbCwIutD-ra-dI2R-FKow8yaYcIPYaJBTVAvWRuMUV3ulMX0ezUaW2JCQaN6oIEjZhVHunIM2Li6Zx4pxHF5gedE0lmuD5doYQ1KcfBzHxLUx8U7BtUmJtDp_Ro113_OGw8i1YdZTLzoPY3Aa1n53VW3KabtVNZX1dqk7sawd4j2vv0yDe9Z1n4zSa7M7U-CejYIfDO1CgxmbXrSoPoYNSYDOkb-QIG7kGZcuj2hbVUtez_hjgxV4l7PuoiaiNqBm0rkkIjM14dvABFdqNUmzeGoCDbFspMIrtYq5m07VfQ_IhisM5oFoyG4pet9GKkKzRT8YEtiYRN6gpb0Z9W__JyeMDk79NBqW2Hv9dKjfuh_bOI5a0W0tPrC-x8PSvXmxCW0sMLLxOxXlxSIo-S5X-gyvNyft0194ySUt4LmRlVAcvnQiqndya-eRWbnbPQVCnLguzTKG04EYvhC73HoAOMTbfl79z3q7fnp4edmeD2mnsWRibKCX0neaSJu_nn0I4e7_gZg3EGtl_aGYPxALWMzcJM0GYkHf4ijxMIkRQgCfCvVQqnwtGH-mO72rWwEJQjJUFHYIPvMSzFIWMBSHY7FoMjRoKjTrh6fB4HjK52Fo2oZ9KRZmGUduNBTDt6GR28Rs2ijhgccps_8PxCbThhAeiA3T1jkyVBoMxKJptPBCzI_8GMeu6_vUHYhFo5kRhxOexoNa8cPYI36IwJ5lzBEGb0m8ZEXhBMhsd_V-3VwszXY9HignvaQRGnk4IBgNk0ZuSxq5LWlkONdmxGaSNhSbTtpIbJi0GbHwNrHoFjHIqsmu5w7ECjkxPc3ebHRkM43AQ_PHMPNR03rxQG-VTur1ohm9wXW9aaWsI1EvHMOl5BpJ0JI_HdtK3CVGJ871B3mRDmOKHgF9CjTMJ0HEQy4hKHSJGzhkxbOAYZ6iMA3iBf6HHyv8jxXCsUu8aBlHJx_GDEtTfivFW7ko8rI5LnZl88Mci0MeGyUd8nidTukRKddYkwWO4HPyd7r-66-WCf1iuDm9gHZUysxTWOz-y2wKLLJGj9R3i4ItcHStVEasygR3UhpKxN2AQ8KBmw4Jb2ZXpqgV2n4SxNJ0LoQjosVx101JX2le0KTgerd1Jlwmnhm-ZT557RR0H7DXo2EcFJ-JGOK3N27hiqc4mHbsv0LATNrxMzzMO9G-3Hyi4zlP8YiYUXXV9nOz6Z7YxC_s5pvgaUw6YmosNdJiqup0jrgYNOJlbudTLlBGtMztvMgQakTN_CCbcYZKRnTN7WRGD2fE1iQFDJTxuGUJ1PdDIgpQdZNAJmT7Zx9dZBOwI-Kmx3fgcMarEUdTiqnMpiP-hV5yECdRhknS2j43u5-_bp8-P2wcf-U6_ma53RrewP5tU5kFGU0bm45IHXu4jM5EiM0FG54tL3BGLI_FQWNCxTIivbY4YHsmMkhnM9j7U_akfWzE-Iyn0RxH0sMZ0T8_yI9cQI1YoNvpkSHUiP_5QYLkDMVHDNBPz6Uh8ogPmqVRLgaNuJ-CzfZh3XvPNMi0ESP-59_jL3rExWnyYooAlu_wEXhqpJ72_9KUhyHpcfEJr9Ab1haChgeCaXoDIe8KvdGC8SQNsyGaPXIlbhqH2CU09Uma-MkMh6HRMv0JOc5cGvUD_MvLx6bWG6OXWubl7grBcY41m421E6AO_cuHx_kU_gT10XqQRZGXpvbVnKUSS28Z2PdzVCHqbSHEt6baqqbiknT8jncbVzJkEMiE-jBhaEb9Qe1O2nnJuDTa8Sy38o72cc14hBLmX-FWsu4TJVF0hVvpfEkQYkPbxjUTMC_MEGifjcPa3UxyfpVtOflkI9_nWaydGWLRNeLk_MFXiJOuLlPER2hkLNbuV6_vdN8_HXhXqJezd3xojzfOQsaSGEHBupNtd97VkcZOgLayLth2V4iEFlv7QsQJ7h2Kpk_OWH0coQjgEvgKVXMltj9B1djA8GzI7Paomt6u8p1MmQke_eBxTt1mVI_H6e2_bjDK-1GjLmgeryPKJ4_ld-zeZbEb0zt-j0NMQj9GUXC3v3cDTKKUxmnK3JinCeYkpBjRIIlJhuL0Lr83jIuHEfaI5wXLkAWcBh7BxAtdionjIX6gebEsitfDUsjdXa5Uw--jiITuXUETXijz1iQhJX8D81AfMP3NnbzXYxZJs1OOh4pc1eqMUud1we_bIOSvfGFfQfxTinIHD-b9wwMvaxCZPrQ3-lpBLU57CwVi8AIkvO15Ce3rUHm5A1r2XnTsveS4vGtkcX_lDUBtaPffopLCvNZGHo17yiGPxv3_DwAA__8dCioK">