Skip to content

Several platforms still have incorrectly aligned u128/i128 #128950

Closed
@beetrees

Description

@beetrees

Edit: This issue has been fixed in LLVM 20 and in the rustc target specifications (meaning rustc-emitted allocations will now use the correct alignment, and std::mem::align_of::<u128>() will give the correct result). The only thing remaining is for rustc to update to LLVM 20 in case LLVM itself uses the alignment in a way that affects the ABI.

Original description

I tried this code:

fn main() {
    dbg!(std::mem::align_of::<u128>());
}

I expected to see this happen: The printed alignment to match the alignment used for __int128_t by GCC and Clang.

Instead, this happened: On 64-bit PowerPC, 64-bit SPARC and 64-bit MIPS, Rust thinks the alignment is 8 whereas GCC and Clang think the alignment is 16. The PowerPC 64-bit ABI specifications (both ELFv1 and ELFv2) agree with GCC and Clang (I'm not aware of any specification for 128-bit integers on SPARC64 or MIPS64, but GCC/Clang's behaviour seems to be the de-facto standard). This is because the LLVM data layout for the affected platforms doesn't correctly specify the alignment. This is the same as #54341 but on different architectures (cc rust-lang/lang-team#255). I initially discovered this when running abi-cafe on PowerPC64 to test #128643. I've filed an LLVM bug at llvm/llvm-project#102783.

Meta

rustc --version --verbose:

rustc 1.82.0-nightly (ca5d25e2c 2024-08-09)
binary: rustc
commit-hash: ca5d25e2c41f5a6b4ce65c681bf2f94c7ead1f14
commit-date: 2024-08-09
host: x86_64-unknown-linux-gnu
release: 1.82.0-nightly
LLVM version: 19.1.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-ABIArea: Concerning the application binary interface (ABI)A-FFIArea: Foreign function interface (FFI)A-LLVMArea: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.C-bugCategory: This is a bug.O-MIPSTarget: MIPS processorsO-PowerPCTarget: PowerPC processorsO-SPARCTarget: SPARC processorsS-waiting-on-LLVMStatus: the compiler-dragon is eepy, can someone get it some tea?T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.llvm-fixed-upstreamIssue expected to be fixed by the next major LLVM upgrade, or backported fixes

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions