Skip to content

Meaning of "natural alignment" is unclear #249

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
RalfJung opened this issue Mar 17, 2025 · 7 comments
Open

Meaning of "natural alignment" is unclear #249

RalfJung opened this issue Mar 17, 2025 · 7 comments

Comments

@RalfJung
Copy link

RalfJung commented Mar 17, 2025

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
Copy link
Author

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

@dschuff
Copy link
Member

dschuff commented Mar 17, 2025

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

@RalfJung
Copy link
Author

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.

@dschuff
Copy link
Member

dschuff commented Mar 17, 2025

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
Copy link
Member

dschuff commented Mar 17, 2025

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.

@RalfJung
Copy link
Author

RalfJung commented Mar 17, 2025

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.

@workingjubilee
Copy link

workingjubilee commented Mar 17, 2025

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants