1
Fork 0

Merge commit '557ed8ebb7' into sync_cg_clif-2025-02-15

This commit is contained in:
bjorn3 2025-02-15 14:13:01 +00:00
commit 7a6206e9c4
9 changed files with 20 additions and 13 deletions

View file

@ -188,8 +188,8 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
include: include:
# FIXME update at some point in the future once most distros use a newer glibc # Intentionally using an older ubuntu version to lower the glibc requirements of the distributed cg_clif
- os: ubuntu-20.04 - os: ubuntu-22.04
env: env:
TARGET_TRIPLE: x86_64-unknown-linux-gnu TARGET_TRIPLE: x86_64-unknown-linux-gnu
- os: macos-latest - os: macos-latest

View file

@ -1,4 +1,4 @@
[toolchain] [toolchain]
channel = "nightly-2025-02-07" channel = "nightly-2025-02-15"
components = ["rust-src", "rustc-dev", "llvm-tools"] components = ["rust-src", "rustc-dev", "llvm-tools"]
profile = "minimal" profile = "minimal"

View file

@ -3,8 +3,9 @@ ignore = [
] ]
# Matches rustfmt.toml of rustc # Matches rustfmt.toml of rustc
version = "Two" style_edition = "2024"
use_small_heuristics = "Max" use_small_heuristics = "Max"
merge_derives = false merge_derives = false
group_imports = "StdExternalCrate" group_imports = "StdExternalCrate"
imports_granularity = "Module" imports_granularity = "Module"
use_field_init_shorthand = true

View file

@ -195,7 +195,7 @@ pub(super) fn from_casted_value<'tcx>(
// It may also be smaller for example when the type is a wrapper around an integer with a // It may also be smaller for example when the type is a wrapper around an integer with a
// larger alignment than the integer. // larger alignment than the integer.
std::cmp::max(abi_param_size, layout_size), std::cmp::max(abi_param_size, layout_size),
u32::try_from(layout.align.pref.bytes()).unwrap(), u32::try_from(layout.align.abi.bytes()).unwrap(),
); );
let mut offset = 0; let mut offset = 0;
let mut block_params_iter = block_params.iter().copied(); let mut block_params_iter = block_params.iter().copied();

View file

@ -382,6 +382,11 @@ impl<'tcx> FunctionCx<'_, '_, 'tcx> {
} }
pub(crate) fn create_stack_slot(&mut self, size: u32, align: u32) -> Pointer { pub(crate) fn create_stack_slot(&mut self, size: u32, align: u32) -> Pointer {
assert!(
size % align == 0,
"size must be a multiple of alignment (size={size}, align={align})"
);
let abi_align = if self.tcx.sess.target.arch == "s390x" { 8 } else { 16 }; let abi_align = if self.tcx.sess.target.arch == "s390x" { 8 } else { 16 };
if align <= abi_align { if align <= abi_align {
let stack_slot = self.bcx.create_sized_stack_slot(StackSlotData { let stack_slot = self.bcx.create_sized_stack_slot(StackSlotData {
@ -403,7 +408,7 @@ impl<'tcx> FunctionCx<'_, '_, 'tcx> {
align_shift: 4, align_shift: 4,
}); });
let base_ptr = self.bcx.ins().stack_addr(self.pointer_type, stack_slot, 0); let base_ptr = self.bcx.ins().stack_addr(self.pointer_type, stack_slot, 0);
let misalign_offset = self.bcx.ins().urem_imm(base_ptr, i64::from(align)); let misalign_offset = self.bcx.ins().band_imm(base_ptr, i64::from(align - 1));
let realign_offset = self.bcx.ins().irsub_imm(misalign_offset, i64::from(align)); let realign_offset = self.bcx.ins().irsub_imm(misalign_offset, i64::from(align));
Pointer::new(self.bcx.ins().iadd(base_ptr, realign_offset)) Pointer::new(self.bcx.ins().iadd(base_ptr, realign_offset))
} }

View file

@ -304,7 +304,7 @@ impl DebugContext {
entry.set(gimli::DW_AT_decl_file, AttributeValue::FileIndex(Some(file_id))); entry.set(gimli::DW_AT_decl_file, AttributeValue::FileIndex(Some(file_id)));
entry.set(gimli::DW_AT_decl_line, AttributeValue::Udata(line)); entry.set(gimli::DW_AT_decl_line, AttributeValue::Udata(line));
entry.set(gimli::DW_AT_alignment, AttributeValue::Udata(static_layout.align.pref.bytes())); entry.set(gimli::DW_AT_alignment, AttributeValue::Udata(static_layout.align.abi.bytes()));
let mut expr = Expression::new(); let mut expr = Expression::new();
expr.op_addr(address_for_data(data_id)); expr.op_addr(address_for_data(data_id));

View file

@ -166,7 +166,7 @@ impl DebugContext {
let tuple_entry = self.dwarf.unit.get_mut(tuple_type_id); let tuple_entry = self.dwarf.unit.get_mut(tuple_type_id);
tuple_entry.set(gimli::DW_AT_name, AttributeValue::StringRef(self.dwarf.strings.add(name))); tuple_entry.set(gimli::DW_AT_name, AttributeValue::StringRef(self.dwarf.strings.add(name)));
tuple_entry.set(gimli::DW_AT_byte_size, AttributeValue::Udata(layout.size.bytes())); tuple_entry.set(gimli::DW_AT_byte_size, AttributeValue::Udata(layout.size.bytes()));
tuple_entry.set(gimli::DW_AT_alignment, AttributeValue::Udata(layout.align.pref.bytes())); tuple_entry.set(gimli::DW_AT_alignment, AttributeValue::Udata(layout.align.abi.bytes()));
for (i, (ty, dw_ty)) in components.into_iter().enumerate() { for (i, (ty, dw_ty)) in components.into_iter().enumerate() {
let member_id = self.dwarf.unit.add(tuple_type_id, gimli::DW_TAG_member); let member_id = self.dwarf.unit.add(tuple_type_id, gimli::DW_TAG_member);
@ -179,7 +179,7 @@ impl DebugContext {
member_entry.set( member_entry.set(
gimli::DW_AT_alignment, gimli::DW_AT_alignment,
AttributeValue::Udata( AttributeValue::Udata(
FullyMonomorphizedLayoutCx(tcx).layout_of(ty).align.pref.bytes(), FullyMonomorphizedLayoutCx(tcx).layout_of(ty).align.abi.bytes(),
), ),
); );
member_entry.set( member_entry.set(

View file

@ -871,7 +871,8 @@ fn call_inline_asm<'tcx>(
inputs: Vec<(Size, Value)>, inputs: Vec<(Size, Value)>,
outputs: Vec<(Size, CPlace<'tcx>)>, outputs: Vec<(Size, CPlace<'tcx>)>,
) { ) {
let stack_slot = fx.create_stack_slot(u32::try_from(slot_size.bytes()).unwrap(), 16); let stack_slot =
fx.create_stack_slot(u32::try_from(slot_size.bytes().next_multiple_of(16)).unwrap(), 16);
let inline_asm_func = fx let inline_asm_func = fx
.module .module

View file

@ -101,7 +101,7 @@ impl<'tcx> CValue<'tcx> {
/// The is represented by a dangling pointer of suitable alignment. /// The is represented by a dangling pointer of suitable alignment.
pub(crate) fn zst(layout: TyAndLayout<'tcx>) -> CValue<'tcx> { pub(crate) fn zst(layout: TyAndLayout<'tcx>) -> CValue<'tcx> {
assert!(layout.is_zst()); assert!(layout.is_zst());
CValue::by_ref(crate::Pointer::dangling(layout.align.pref), layout) CValue::by_ref(crate::Pointer::dangling(layout.align.abi), layout)
} }
pub(crate) fn layout(&self) -> TyAndLayout<'tcx> { pub(crate) fn layout(&self) -> TyAndLayout<'tcx> {
@ -392,7 +392,7 @@ impl<'tcx> CPlace<'tcx> {
assert!(layout.is_sized()); assert!(layout.is_sized());
if layout.size.bytes() == 0 { if layout.size.bytes() == 0 {
return CPlace { return CPlace {
inner: CPlaceInner::Addr(Pointer::dangling(layout.align.pref), None), inner: CPlaceInner::Addr(Pointer::dangling(layout.align.abi), None),
layout, layout,
}; };
} }
@ -405,7 +405,7 @@ impl<'tcx> CPlace<'tcx> {
let stack_slot = fx.create_stack_slot( let stack_slot = fx.create_stack_slot(
u32::try_from(layout.size.bytes()).unwrap(), u32::try_from(layout.size.bytes()).unwrap(),
u32::try_from(layout.align.pref.bytes()).unwrap(), u32::try_from(layout.align.abi.bytes()).unwrap(),
); );
CPlace { inner: CPlaceInner::Addr(stack_slot, None), layout } CPlace { inner: CPlaceInner::Addr(stack_slot, None), layout }
} }