3 ms·
> When you want to embed a type, you need its definition, but you don’t actually need the full definition. You just need the size/alignment. Aren't there ABI c
by jcelerier 11mo ago
> When you want to embed a type, you need its definition, but you don’t actually need the full definition. You just need the size/alignment.
Aren't there ABI cases where e.g.
struct foo { float X, Y; }
would be passed in e.g. fp registers whereas
struct { char[8]; }
would not?
- threeducks 11mo agoYes. For example consider this function to add two 2D points, which accepts and returns all variables entirely in xmm registers: https://gcc.godbolt.org/z/hPGKrh6W4 https://gcc.godbolt.org/z/hPGKrh6W4 (surprisingly, gcc generates some fairly odd assembly code here)
- anematode 11mo agoIt's fixed if you pass -fno-trapping-math. There could be junk in the upper half of the registers that causes a floating-point exception.
- threeducks 11mo agoOh, that explains the seemingly useless movs. Thank you! I simply thought that it was a bug, since clang did not emit them.
- marler8997 11mo agoYeah this is correct. You don't want to pass these values around "by value" but, you should be able to "embed them" and pass "pointers to them". It's a middle-ground between a completely opaque type which you would also pass around by address, but, with the added benefit that you allocate your own storage for it. I sort of mentioned this in the blog but this is good clarification. > if you want to pass a shared_ptr to Zig, you need to pass a pointer to the shared pointer For lore, I believe this GitHub thread is where I first learned about the how types of the same size/alignment can still have different ABIs :) https://github.com/microsoft/win32metadata/issues/623#issuecomment-917143574 https://github.com/microsoft/win32metadata/issues/623#issuec...