Meaning of "natural alignment" is unclear
The CABI documentation uses the term "natural alignment" of a type without defining its meaning. Talking to different people I have encountered two common meanings of this word:
- it refers to the default alignment the type has without adding any alignment-modifying attributes
- it means the alignment equals the size of the type
For the sake of clarity of this spec, it would be good to spell out exactly which meaning is intended here.
It seems on wasm those two definitions coincide for each type? Maybe that's clear to everyone involved; as someone working on a general-purpose compiler and stumbling upon this document after being dragged into a wasm discussion, that has not been clear to me. ;)
Thanks for pointing this out. I'm pretty sure I've always used the latter meaning (and the spec does as well). But in this case it may be that we actually mean the first.
Oops, I see that I'm racing you ...
The table on the page I referenced above says that long double can have size > align on emscripten, so there could be a potential problem there.
Yes, I think all the types actually have what I would term "natural alignment" except emscripten's long double, but that may be passed in a pair of i64 values for ABI purposes.
But if there's going to be some kind of obscure bug, I would bet on a case like long double, since it's a weird and obscure type anyway.
that may be passed in a pair of i64 values for ABI purposes.
Well this is the question. Consider this type (Rust syntax, as I do not know the equivalent C syntax ;)
#[repr(align(16))]
struct T(f128);
If we take the first meaning of the two I described for "natural alignment", then it should be passed directly on emscripten, meaning in two i64 arguments. If we take the second meaning, it should be passed indirectly.
typedef struct
{
alignas(16) _Float128 value;
} AlignedF128;