tool-conventions icon indicating copy to clipboard operation
tool-conventions copied to clipboard

Meaning of "natural alignment" is unclear

Open RalfJung opened this issue 9 months ago • 7 comments

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.

RalfJung avatar Mar 17 '25 16:03 RalfJung

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. ;)

RalfJung avatar Mar 17 '25 16:03 RalfJung

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 ...

dschuff avatar Mar 17 '25 16:03 dschuff

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.

RalfJung avatar Mar 17 '25 16:03 RalfJung

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.

dschuff avatar Mar 17 '25 16:03 dschuff

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.

dschuff avatar Mar 17 '25 16:03 dschuff

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.

RalfJung avatar Mar 17 '25 16:03 RalfJung

typedef struct 
{
    alignas(16) _Float128 value;
} AlignedF128;

workingjubilee avatar Mar 17 '25 17:03 workingjubilee