diff options
| author | bors <bors@rust-lang.org> | 2024-05-07 03:46:03 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-05-07 03:46:03 +0000 |
| commit | d71b3f486ac5e990acc33b22d308fcd57cbe9114 (patch) | |
| tree | c459d1ec6f271eaa4196f16b9f877acd419e0709 /compiler/rustc_codegen_llvm/src | |
| parent | 5ae5d135372c4b576edc73c191d2dc86b1d16b5c (diff) | |
| parent | 4d397d33da8aff64419a03694d152c8250916f19 (diff) | |
| download | rust-d71b3f486ac5e990acc33b22d308fcd57cbe9114.tar.gz rust-d71b3f486ac5e990acc33b22d308fcd57cbe9114.zip | |
Auto merge of #124813 - maurer:llvm-aarch64-fn32, r=nikic
Adjust 64-bit ARM data layouts for LLVM update LLVM has updated data layouts to specify `Fn32` on 64-bit ARM to avoid C++ accidentally underaligning functions when trying to comply with member function ABIs. This should only affect Rust in cases where we had a similar bug (I don't believe we have one), but our data layout must match to generate code. As a compatibility adaptatation, if LLVM is not version 19 yet, `Fn32` gets voided from the data layout. See llvm/llvm-project#90415 `@rustbot` label: +llvm-main cc `@krasimirgg` r? `@durin42`
Diffstat (limited to 'compiler/rustc_codegen_llvm/src')
| -rw-r--r-- | compiler/rustc_codegen_llvm/src/context.rs | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/compiler/rustc_codegen_llvm/src/context.rs b/compiler/rustc_codegen_llvm/src/context.rs index 653abb4e41b..53a098d178e 100644 --- a/compiler/rustc_codegen_llvm/src/context.rs +++ b/compiler/rustc_codegen_llvm/src/context.rs @@ -133,6 +133,15 @@ pub unsafe fn create_module<'ll>( } } + if llvm_version < (19, 0, 0) { + if sess.target.arch == "aarch64" || sess.target.arch.starts_with("arm64") { + // LLVM 19 sets -Fn32 in its data layout string for 64-bit ARM + // Earlier LLVMs leave this default, so remove it. + // See https://github.com/llvm/llvm-project/pull/90702 + target_data_layout = target_data_layout.replace("-Fn32", ""); + } + } + // Ensure the data-layout values hardcoded remain the defaults. { let tm = crate::back::write::create_informational_target_machine(tcx.sess); |
