-
Notifications
You must be signed in to change notification settings - Fork 13.3k
Shape and LLVM disagree about the alignment of 64-bit ints on 32-bit x86 #2303
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
Comments
If you replace all the u64s in that test with u32s then the results are still the same - the alignment is off and the shape code doesn't print the value correctly. |
I'm not sure how closely related |
We should do what C does. That said, I don't know what "preferred" alignment means. |
But my guess is it means the alignment the type should have. They probably say "preferred" because they themselves to do not guarantee this alignment? |
Just saw that clang and gcc don't agree. Woah. That surprises me. |
Sorry for the repeated comments... one last thought: it seems to me that gcc is internally inconsistent. As I understand the C alignment rules, the alignment of a struct is the maximum alignment of any of its members. So the alignment of uint64_t can't be 8 if the alignment of a struct w/ uint64_t within is only 4... something's fishy. |
one last thought about preferred alignment---also, the user can typically override the alignment of a given field etc with pragmas, so maybe that's why LLVM terms it the 'preferred' alignment |
bbc4a74 fixes the issue in the shape code. it does not fix the issue that align_of is reporting 8 when it should probably be 4 |
The above test had to be xfailed on windows. Have to investigate. |
This is fixed. |
On x86 our shape code does not agree with llvm, clang, or gcc about the alignment of structs containing 64-bit integer fields.
In C this struct is 4-byte aligned on 32-bit x86:
When we produce the equivalent struct in Rust, LLVM produces code that uses C's 4-byte alignment, but the shape code thinks it has 8-byte alignment and things go bad. Let's take a look!
This affects enums too.
I think we should just do what LLVM wants us to do and accept the 4-byte alignment.
Interesting tidbit I guess: while clang and gcc agree on the alignment of the struct containing a
uint64_t
(it's 4), they don't agree on the alignment ofuint64_t
itself - clang says 4, gcc says 8The text was updated successfully, but these errors were encountered: