<div dir="ltr"><div>Hi all,</div><div><br></div><div>I'm having trouble with calling struct returning functions with alien on a 64bit linux vm using the hidden first argument mechanism [1]. The function gets called, but the result is not copied into the struct pointed by the hidden argument.</div><div><br></div><div>I tried to debug what happens with gdb, but everything looks fine, except not getting the result back. The address is copied into %rdi (regs[0]) in dax64business.h:92 [2], which is exactly what the spec says [3].<br></div><div><br></div><div>Here is a minimal example calling a C function returning a struct with two doubles:<br></div><div><br></div><div>at34 := Alien lookup: 'at34' inLibrary: 'libalientest.so'.<br>at34 primFFICallResult: nil with: (r := Alien newC: 16) pointer.<br>vec := (r doubleAt: 1) @ (r doubleAt: 9). r free. vec " 0.0@0.0 "<br></div><div><br></div><div>returns 0.0@0.0 instead of 3.0@4.0<br></div><div><br></div><div>the C code goes like this:<br></div><div><br></div><div>typedef struct atvect{double x, y;} atvect;</div><div><br></div><div>atvect atv(double x, double y) {<br>  atvect v = {x, y};<br>  return v;<br>}<br></div><div><br></div><div>atvect at34() {<br>  return atv(3.0, 4.0);<br>}</div><div><br></div><div>The vm is sqcogspur64linuxht 5.0-201910291408. The image is a recent trunk image (update: #19142), image format 68021 (64 bit). Alien is Alien-Core-TorstenBergmann.101.mcz.</div><div><br></div><div>What am I missing?<br></div><div><br></div><div>Thanks, Balázs</div><div><br></div><div>[1] "The rules for structure results vary slightly by platform. Most functions returning structures expect a “hidden” first parameter holding the result struct’s address. Because the FFI provides no abstraction one must pass this parameter explicitly. ... On linux all struct results are re-turned through the hidden first argument mechanism ... ". <br></div><div><br></div><div><a href="https://wiki.squeak.org/squeak/uploads/6100/Alien%20FFI.2.pdf">https://wiki.squeak.org/squeak/uploads/6100/Alien%20FFI.2.pdf</a></div><div><br></div><div>[2] <a href="https://github.com/OpenSmalltalk/opensmalltalk-vm/blob/a8a1dc1e33267e0fa2dab22959e41d0a072420d9/platforms/Cross/plugins/IA32ABI/dax64business.h#L92">https://github.com/OpenSmalltalk/opensmalltalk-vm/blob/a8a1dc1e33267e0fa2dab22959e41d0a072420d9/platforms/Cross/plugins/IA32ABI/dax64business.h#L92</a></div><div><br></div><div>[3] "2. If the type has class MEMORY, then the caller provides space for the return value and passes the address of this storage in %rdi as if it were the first<br>argument to the function. In effect, this address becomes a “hidden” first ar-<br>gument. This storage must not overlap any data visible to the callee through<br>other names than this argument. <br></div><div>On return %rax will contain the address that has been passed in by the<br>caller in %rdi."</div><div><br></div><div> <a href="https://github.com/hjl-tools/x86-psABI/wiki/x86-64-psABI-1.0.pdf">https://github.com/hjl-tools/x86-psABI/wiki/x86-64-psABI-1.0.pdf</a> p.24.<br></div></div>