Skip to content

Commit 8b79f04

Browse files
committed
LLVM 18 x86 data layout update
With https://reviews.llvm.org/D86310 LLVM now has i128 aligned to 16-bytes on x86 based platforms. This will be in LLVM-18. This patch updates all our spec targets to be 16-byte aligned, and ignores the alignment change when checking what the LLVM's default spec is on the relevant targets for older LLVMs. This results in Rust overaligning things relative to LLVM on older LLVMs. See #54341
1 parent 3c23df4 commit 8b79f04

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+108
-84
lines changed

compiler/rustc_ast/src/ast.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3185,9 +3185,13 @@ mod size_asserts {
31853185
static_assert_size!(Impl, 136);
31863186
static_assert_size!(Item, 136);
31873187
static_assert_size!(ItemKind, 64);
3188-
static_assert_size!(LitKind, 24);
3188+
// This can be removed after i128:128 is in the bootstrap compiler's target.
3189+
#[cfg(not(bootstrap))]
3190+
static_assert_size!(LitKind, 32);
31893191
static_assert_size!(Local, 72);
3190-
static_assert_size!(MetaItemLit, 40);
3192+
// This can be removed after i128:128 is in the bootstrap compiler's target.
3193+
#[cfg(not(bootstrap))]
3194+
static_assert_size!(MetaItemLit, 48);
31913195
static_assert_size!(Param, 40);
31923196
static_assert_size!(Pat, 72);
31933197
static_assert_size!(Path, 24);

compiler/rustc_codegen_llvm/src/context.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,12 +186,26 @@ pub unsafe fn create_module<'ll>(
186186
let cfg_llvm_root = option_env!("CFG_LLVM_ROOT").unwrap_or("");
187187
let custom_llvm_used = !cfg_llvm_root.trim().is_empty();
188188

189-
if !custom_llvm_used && target_data_layout != llvm_data_layout {
189+
let mut checked_target_data_layout = target_data_layout.clone();
190+
if llvm_version < (18, 0, 0) {
191+
if sess.target.arch == "x86" || sess.target.arch == "x86_64" {
192+
// LLVM 18 adjusts i128 to be 128-bit aligned on x86 variants.
193+
// Earlier LLVMs leave this as default alignment, so remove it.
194+
// We only modify the checked data layout because LLVM will generate incorrect code without it.
195+
// This matches the behavior of Clang on earlier LLVMs, which reduces the likelihood of problems arising from it.
196+
// This removal acts as our acknowledgement of this deviation between the default LLVM target spec and the one we are using.
197+
//
198+
// See https://reviews.llvm.org/D86310
199+
checked_target_data_layout = checked_target_data_layout.replace("-i128:128", "");
200+
}
201+
}
202+
203+
if !custom_llvm_used && checked_target_data_layout != llvm_data_layout {
190204
bug!(
191205
"data-layout for target `{rustc_target}`, `{rustc_layout}`, \
192206
differs from LLVM target's `{llvm_target}` default layout, `{llvm_layout}`",
193207
rustc_target = sess.opts.target_triple,
194-
rustc_layout = target_data_layout,
208+
rustc_layout = checked_target_data_layout,
195209
llvm_target = sess.target.llvm_target,
196210
llvm_layout = llvm_data_layout
197211
);

compiler/rustc_middle/src/mir/mod.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1585,13 +1585,19 @@ mod size_asserts {
15851585
use super::*;
15861586
use rustc_data_structures::static_assert_size;
15871587
// tidy-alphabetical-start
1588-
static_assert_size!(BasicBlockData<'_>, 136);
1588+
// This can be removed after i128:128 is in the bootstrap compiler's target.
1589+
#[cfg(not(bootstrap))]
1590+
static_assert_size!(BasicBlockData<'_>, 144);
15891591
static_assert_size!(LocalDecl<'_>, 40);
15901592
static_assert_size!(SourceScopeData<'_>, 72);
15911593
static_assert_size!(Statement<'_>, 32);
15921594
static_assert_size!(StatementKind<'_>, 16);
1593-
static_assert_size!(Terminator<'_>, 104);
1594-
static_assert_size!(TerminatorKind<'_>, 88);
1595+
// This can be removed after i128:128 is in the bootstrap compiler's target.
1596+
#[cfg(not(bootstrap))]
1597+
static_assert_size!(Terminator<'_>, 112);
1598+
// This can be removed after i128:128 is in the bootstrap compiler's target.
1599+
#[cfg(not(bootstrap))]
1600+
static_assert_size!(TerminatorKind<'_>, 96);
15951601
static_assert_size!(VarDebugInfo<'_>, 88);
15961602
// tidy-alphabetical-end
15971603
}

compiler/rustc_target/src/spec/i386_apple_ios.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pub fn target() -> Target {
1111
llvm_target: ios_sim_llvm_target(arch).into(),
1212
pointer_width: 32,
1313
data_layout: "e-m:o-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
14-
f64:32:64-f80:128-n8:16:32-S128"
14+
i128:128-f64:32:64-f80:128-n8:16:32-S128"
1515
.into(),
1616
arch: arch.target_arch(),
1717
options: TargetOptions {

compiler/rustc_target/src/spec/i686_apple_darwin.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ pub fn target() -> Target {
1919
llvm_target: macos_llvm_target(Arch::I686).into(),
2020
pointer_width: 32,
2121
data_layout: "e-m:o-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
22-
f64:32:64-f80:128-n8:16:32-S128"
22+
i128:128-f64:32:64-f80:128-n8:16:32-S128"
2323
.into(),
2424
arch: arch.target_arch(),
2525
options: TargetOptions { mcount: "\u{1}mcount".into(), ..base },

compiler/rustc_target/src/spec/i686_linux_android.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ pub fn target() -> Target {
1717
llvm_target: "i686-linux-android".into(),
1818
pointer_width: 32,
1919
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
20-
f64:32:64-f80:32-n8:16:32-S128"
20+
i128:128-f64:32:64-f80:32-n8:16:32-S128"
2121
.into(),
2222
arch: "x86".into(),
2323
options: TargetOptions { supported_sanitizers: SanitizerSet::ADDRESS, ..base },

compiler/rustc_target/src/spec/i686_unknown_freebsd.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pub fn target() -> Target {
1111
llvm_target: "i686-unknown-freebsd".into(),
1212
pointer_width: 32,
1313
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
14-
f64:32:64-f80:32-n8:16:32-S128"
14+
i128:128-f64:32:64-f80:32-n8:16:32-S128"
1515
.into(),
1616
arch: "x86".into(),
1717
options: base,

compiler/rustc_target/src/spec/i686_unknown_haiku.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pub fn target() -> Target {
1111
llvm_target: "i686-unknown-haiku".into(),
1212
pointer_width: 32,
1313
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
14-
f64:32:64-f80:32-n8:16:32-S128"
14+
i128:128-f64:32:64-f80:32-n8:16:32-S128"
1515
.into(),
1616
arch: "x86".into(),
1717
options: base,

compiler/rustc_target/src/spec/i686_unknown_hurd_gnu.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pub fn target() -> Target {
1111
llvm_target: "i686-unknown-hurd-gnu".into(),
1212
pointer_width: 32,
1313
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
14-
f64:32:64-f80:32-n8:16:32-S128"
14+
i128:128-f64:32:64-f80:32-n8:16:32-S128"
1515
.into(),
1616
arch: "x86".into(),
1717
options: base,

compiler/rustc_target/src/spec/i686_unknown_linux_gnu.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ pub fn target() -> Target {
1212
llvm_target: "i686-unknown-linux-gnu".into(),
1313
pointer_width: 32,
1414
data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
15-
f64:32:64-f80:32-n8:16:32-S128"
15+
i128:128-f64:32:64-f80:32-n8:16:32-S128"
1616
.into(),
1717
arch: "x86".into(),
1818
options: base,

0 commit comments

Comments
 (0)