Auto merge of #54071 - eddyb:alignsssss, r=oli-obk
rustc_target: separate out an individual alignment quantity type from Align. Before this PR, `rustc_target::abi::Align` combined "power-of-two alignment quantity" semantics, with a distinction between ABI (required) and preferred alignment (by having two quantities). After this PR, `Align` is only *one* such quantity, and a new `AbiAndPrefAlign` type is introduced to hold the pair of ABI and preferred `Align` quantities. `Align` is used everywhere one quantity is necessary/sufficient, simplifying some of the code in codegen/miri, while `AbiAndPrefAlign` only in layout computation (to propagate preferred alignment). r? @oli-obk cc @nagisa @RalfJung @nikomatsakis
This commit is contained in:
commit
6a2d1b4e15
41 changed files with 366 additions and 377 deletions
|
|
@ -73,7 +73,7 @@ impl ArgAttributesExt for ArgAttributes {
|
|||
if let Some(align) = self.pointee_align {
|
||||
llvm::LLVMRustAddAlignmentAttr(llfn,
|
||||
idx.as_uint(),
|
||||
align.abi() as u32);
|
||||
align.bytes() as u32);
|
||||
}
|
||||
regular.for_each_kind(|attr| attr.apply_llfn(idx, llfn));
|
||||
}
|
||||
|
|
@ -98,7 +98,7 @@ impl ArgAttributesExt for ArgAttributes {
|
|||
if let Some(align) = self.pointee_align {
|
||||
llvm::LLVMRustAddAlignmentCallSiteAttr(callsite,
|
||||
idx.as_uint(),
|
||||
align.abi() as u32);
|
||||
align.bytes() as u32);
|
||||
}
|
||||
regular.for_each_kind(|attr| attr.apply_callsite(idx, callsite));
|
||||
}
|
||||
|
|
@ -204,7 +204,7 @@ impl ArgTypeExt<'ll, 'tcx> for ArgType<'tcx, Ty<'tcx>> {
|
|||
return;
|
||||
}
|
||||
if self.is_sized_indirect() {
|
||||
OperandValue::Ref(val, None, self.layout.align).store(bx, dst)
|
||||
OperandValue::Ref(val, None, self.layout.align.abi).store(bx, dst)
|
||||
} else if self.is_unsized_indirect() {
|
||||
bug!("unsized ArgType must be handled through store_fn_arg");
|
||||
} else if let PassMode::Cast(cast) = self.mode {
|
||||
|
|
@ -214,7 +214,7 @@ impl ArgTypeExt<'ll, 'tcx> for ArgType<'tcx, Ty<'tcx>> {
|
|||
if can_store_through_cast_ptr {
|
||||
let cast_ptr_llty = bx.cx().type_ptr_to(cast.llvm_type(bx.cx()));
|
||||
let cast_dst = bx.pointercast(dst.llval, cast_ptr_llty);
|
||||
bx.store(val, cast_dst, self.layout.align);
|
||||
bx.store(val, cast_dst, self.layout.align.abi);
|
||||
} else {
|
||||
// The actual return type is a struct, but the ABI
|
||||
// adaptation code has cast it into some scalar type. The
|
||||
|
|
@ -242,7 +242,7 @@ impl ArgTypeExt<'ll, 'tcx> for ArgType<'tcx, Ty<'tcx>> {
|
|||
// ...and then memcpy it to the intended destination.
|
||||
bx.memcpy(
|
||||
dst.llval,
|
||||
self.layout.align,
|
||||
self.layout.align.abi,
|
||||
llscratch,
|
||||
scratch_align,
|
||||
bx.cx().const_usize(self.layout.size.bytes()),
|
||||
|
|
@ -273,7 +273,7 @@ impl ArgTypeExt<'ll, 'tcx> for ArgType<'tcx, Ty<'tcx>> {
|
|||
OperandValue::Pair(next(), next()).store(bx, dst);
|
||||
}
|
||||
PassMode::Indirect(_, Some(_)) => {
|
||||
OperandValue::Ref(next(), Some(next()), self.layout.align).store(bx, dst);
|
||||
OperandValue::Ref(next(), Some(next()), self.layout.align.abi).store(bx, dst);
|
||||
}
|
||||
PassMode::Direct(_) | PassMode::Indirect(_, None) | PassMode::Cast(_) => {
|
||||
self.store(bx, next(), dst);
|
||||
|
|
@ -545,7 +545,7 @@ impl<'tcx> FnTypeExt<'tcx> for FnType<'tcx, Ty<'tcx>> {
|
|||
adjust_for_rust_scalar(&mut b_attrs,
|
||||
b,
|
||||
arg.layout,
|
||||
a.value.size(cx).abi_align(b.value.align(cx)),
|
||||
a.value.size(cx).align_to(b.value.align(cx).abi),
|
||||
false);
|
||||
arg.mode = PassMode::Pair(a_attrs, b_attrs);
|
||||
return arg;
|
||||
|
|
|
|||
|
|
@ -475,7 +475,7 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||
llvm::LLVMBuildAlloca(self.llbuilder, ty,
|
||||
name.as_ptr())
|
||||
};
|
||||
llvm::LLVMSetAlignment(alloca, align.abi() as c_uint);
|
||||
llvm::LLVMSetAlignment(alloca, align.bytes() as c_uint);
|
||||
alloca
|
||||
}
|
||||
}
|
||||
|
|
@ -494,7 +494,7 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||
llvm::LLVMBuildArrayAlloca(self.llbuilder, ty, len,
|
||||
name.as_ptr())
|
||||
};
|
||||
llvm::LLVMSetAlignment(alloca, align.abi() as c_uint);
|
||||
llvm::LLVMSetAlignment(alloca, align.bytes() as c_uint);
|
||||
alloca
|
||||
}
|
||||
}
|
||||
|
|
@ -503,7 +503,7 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||
self.count_insn("load");
|
||||
unsafe {
|
||||
let load = llvm::LLVMBuildLoad(self.llbuilder, ptr, noname());
|
||||
llvm::LLVMSetAlignment(load, align.abi() as c_uint);
|
||||
llvm::LLVMSetAlignment(load, align.bytes() as c_uint);
|
||||
load
|
||||
}
|
||||
}
|
||||
|
|
@ -658,7 +658,7 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||
let align = if flags.contains(MemFlags::UNALIGNED) {
|
||||
1
|
||||
} else {
|
||||
align.abi() as c_uint
|
||||
align.bytes() as c_uint
|
||||
};
|
||||
llvm::LLVMSetAlignment(store, align);
|
||||
if flags.contains(MemFlags::VOLATILE) {
|
||||
|
|
@ -893,8 +893,8 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||
let dst = self.pointercast(dst, self.cx().type_i8p());
|
||||
let src = self.pointercast(src, self.cx().type_i8p());
|
||||
unsafe {
|
||||
llvm::LLVMRustBuildMemCpy(self.llbuilder, dst, dst_align.abi() as c_uint,
|
||||
src, src_align.abi() as c_uint, size, is_volatile);
|
||||
llvm::LLVMRustBuildMemCpy(self.llbuilder, dst, dst_align.bytes() as c_uint,
|
||||
src, src_align.bytes() as c_uint, size, is_volatile);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -913,8 +913,8 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||
let dst = self.pointercast(dst, self.cx().type_i8p());
|
||||
let src = self.pointercast(src, self.cx().type_i8p());
|
||||
unsafe {
|
||||
llvm::LLVMRustBuildMemMove(self.llbuilder, dst, dst_align.abi() as c_uint,
|
||||
src, src_align.abi() as c_uint, size, is_volatile);
|
||||
llvm::LLVMRustBuildMemMove(self.llbuilder, dst, dst_align.bytes() as c_uint,
|
||||
src, src_align.bytes() as c_uint, size, is_volatile);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -930,7 +930,7 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||
let intrinsic_key = format!("llvm.memset.p0i8.i{}", ptr_width);
|
||||
let llintrinsicfn = self.cx().get_intrinsic(&intrinsic_key);
|
||||
let ptr = self.pointercast(ptr, self.cx().type_i8p());
|
||||
let align = self.cx().const_u32(align.abi() as u32);
|
||||
let align = self.cx().const_u32(align.bytes() as u32);
|
||||
let volatile = self.cx().const_bool(flags.contains(MemFlags::VOLATILE));
|
||||
self.call(llintrinsicfn, &[ptr, fill_byte, size, align, volatile], None);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -357,7 +357,7 @@ impl ConstMethods<'tcx> for CodegenCx<'ll, 'tcx> {
|
|||
offset: Size,
|
||||
) -> PlaceRef<'tcx, &'ll Value> {
|
||||
let init = const_alloc_to_llvm(self, alloc);
|
||||
let base_addr = self.static_addr_of(init, layout.align, None);
|
||||
let base_addr = self.static_addr_of(init, layout.align.abi, None);
|
||||
|
||||
let llval = unsafe { llvm::LLVMConstInBoundsGEP(
|
||||
self.static_bitcast(base_addr, self.type_i8p()),
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@ fn set_global_alignment(cx: &CodegenCx<'ll, '_>,
|
|||
// Note: GCC and Clang also allow `__attribute__((aligned))` on variables,
|
||||
// which can force it to be smaller. Rust doesn't support this yet.
|
||||
if let Some(min) = cx.sess().target.target.options.min_global_align {
|
||||
match ty::layout::Align::from_bits(min, min) {
|
||||
match Align::from_bits(min) {
|
||||
Ok(min) => align = align.max(min),
|
||||
Err(err) => {
|
||||
cx.sess().err(&format!("invalid minimum global alignment: {}", err));
|
||||
|
|
@ -102,7 +102,7 @@ fn set_global_alignment(cx: &CodegenCx<'ll, '_>,
|
|||
}
|
||||
}
|
||||
unsafe {
|
||||
llvm::LLVMSetAlignment(gv, align.abi() as u32);
|
||||
llvm::LLVMSetAlignment(gv, align.bytes() as u32);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -219,7 +219,7 @@ impl StaticMethods<'tcx> for CodegenCx<'ll, 'tcx> {
|
|||
unsafe {
|
||||
// Upgrade the alignment in cases where the same constant is used with different
|
||||
// alignment requirements
|
||||
let llalign = align.abi() as u32;
|
||||
let llalign = align.bytes() as u32;
|
||||
if llalign > llvm::LLVMGetAlignment(gv) {
|
||||
llvm::LLVMSetAlignment(gv, llalign);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -323,7 +323,7 @@ fn fixed_vec_metadata(
|
|||
llvm::LLVMRustDIBuilderCreateArrayType(
|
||||
DIB(cx),
|
||||
size.bits(),
|
||||
align.abi_bits() as u32,
|
||||
align.bits() as u32,
|
||||
element_type_metadata,
|
||||
subscripts)
|
||||
};
|
||||
|
|
@ -465,7 +465,7 @@ fn trait_pointer_metadata(
|
|||
syntax_pos::DUMMY_SP),
|
||||
offset: layout.fields.offset(0),
|
||||
size: data_ptr_field.size,
|
||||
align: data_ptr_field.align,
|
||||
align: data_ptr_field.align.abi,
|
||||
flags: DIFlags::FlagArtificial,
|
||||
discriminant: None,
|
||||
},
|
||||
|
|
@ -474,7 +474,7 @@ fn trait_pointer_metadata(
|
|||
type_metadata: type_metadata(cx, vtable_field.ty, syntax_pos::DUMMY_SP),
|
||||
offset: layout.fields.offset(1),
|
||||
size: vtable_field.size,
|
||||
align: vtable_field.align,
|
||||
align: vtable_field.align.abi,
|
||||
flags: DIFlags::FlagArtificial,
|
||||
discriminant: None,
|
||||
},
|
||||
|
|
@ -787,7 +787,7 @@ fn basic_type_metadata(cx: &CodegenCx<'ll, 'tcx>, t: Ty<'tcx>) -> &'ll DIType {
|
|||
DIB(cx),
|
||||
name.as_ptr(),
|
||||
size.bits(),
|
||||
align.abi_bits() as u32,
|
||||
align.bits() as u32,
|
||||
encoding)
|
||||
};
|
||||
|
||||
|
|
@ -818,7 +818,7 @@ fn pointer_type_metadata(
|
|||
DIB(cx),
|
||||
pointee_type_metadata,
|
||||
pointer_size.bits(),
|
||||
pointer_align.abi_bits() as u32,
|
||||
pointer_align.bits() as u32,
|
||||
name.as_ptr())
|
||||
}
|
||||
}
|
||||
|
|
@ -985,13 +985,12 @@ impl<'tcx> StructMemberDescriptionFactory<'tcx> {
|
|||
f.ident.to_string()
|
||||
};
|
||||
let field = layout.field(cx, i);
|
||||
let (size, align) = field.size_and_align();
|
||||
MemberDescription {
|
||||
name,
|
||||
type_metadata: type_metadata(cx, field.ty, self.span),
|
||||
offset: layout.fields.offset(i),
|
||||
size,
|
||||
align,
|
||||
size: field.size,
|
||||
align: field.align.abi,
|
||||
flags: DIFlags::FlagZero,
|
||||
discriminant: None,
|
||||
}
|
||||
|
|
@ -1109,13 +1108,12 @@ impl<'tcx> UnionMemberDescriptionFactory<'tcx> {
|
|||
-> Vec<MemberDescription<'ll>> {
|
||||
self.variant.fields.iter().enumerate().map(|(i, f)| {
|
||||
let field = self.layout.field(cx, i);
|
||||
let (size, align) = field.size_and_align();
|
||||
MemberDescription {
|
||||
name: f.ident.to_string(),
|
||||
type_metadata: type_metadata(cx, field.ty, self.span),
|
||||
offset: Size::ZERO,
|
||||
size,
|
||||
align,
|
||||
size: field.size,
|
||||
align: field.align.abi,
|
||||
flags: DIFlags::FlagZero,
|
||||
discriminant: None,
|
||||
}
|
||||
|
|
@ -1228,7 +1226,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
|
|||
type_metadata: variant_type_metadata,
|
||||
offset: Size::ZERO,
|
||||
size: self.layout.size,
|
||||
align: self.layout.align,
|
||||
align: self.layout.align.abi,
|
||||
flags: DIFlags::FlagZero,
|
||||
discriminant: None,
|
||||
}
|
||||
|
|
@ -1267,7 +1265,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
|
|||
type_metadata: variant_type_metadata,
|
||||
offset: Size::ZERO,
|
||||
size: self.layout.size,
|
||||
align: self.layout.align,
|
||||
align: self.layout.align.abi,
|
||||
flags: DIFlags::FlagZero,
|
||||
discriminant: Some(self.layout.ty.ty_adt_def().unwrap()
|
||||
.discriminant_for_variant(cx.tcx, i)
|
||||
|
|
@ -1336,7 +1334,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
|
|||
type_metadata: variant_type_metadata,
|
||||
offset: Size::ZERO,
|
||||
size: variant.size,
|
||||
align: variant.align,
|
||||
align: variant.align.abi,
|
||||
flags: DIFlags::FlagZero,
|
||||
discriminant: None,
|
||||
}
|
||||
|
|
@ -1374,7 +1372,7 @@ impl EnumMemberDescriptionFactory<'ll, 'tcx> {
|
|||
type_metadata: variant_type_metadata,
|
||||
offset: Size::ZERO,
|
||||
size: self.layout.size,
|
||||
align: self.layout.align,
|
||||
align: self.layout.align.abi,
|
||||
flags: DIFlags::FlagZero,
|
||||
discriminant: niche_value,
|
||||
}
|
||||
|
|
@ -1565,7 +1563,7 @@ fn prepare_enum_metadata(
|
|||
file_metadata,
|
||||
UNKNOWN_LINE_NUMBER,
|
||||
discriminant_size.bits(),
|
||||
discriminant_align.abi_bits() as u32,
|
||||
discriminant_align.abi.bits() as u32,
|
||||
create_DIArray(DIB(cx), &enumerators_metadata),
|
||||
discriminant_base_type_metadata, true)
|
||||
};
|
||||
|
|
@ -1587,8 +1585,6 @@ fn prepare_enum_metadata(
|
|||
_ => {}
|
||||
}
|
||||
|
||||
let (enum_type_size, enum_type_align) = layout.size_and_align();
|
||||
|
||||
let enum_name = SmallCStr::new(&enum_name);
|
||||
let unique_type_id_str = SmallCStr::new(
|
||||
debug_context(cx).type_map.borrow().get_unique_type_id_as_string(unique_type_id)
|
||||
|
|
@ -1610,8 +1606,8 @@ fn prepare_enum_metadata(
|
|||
enum_name.as_ptr(),
|
||||
file_metadata,
|
||||
UNKNOWN_LINE_NUMBER,
|
||||
enum_type_size.bits(),
|
||||
enum_type_align.abi_bits() as u32,
|
||||
layout.size.bits(),
|
||||
layout.align.abi.bits() as u32,
|
||||
DIFlags::FlagZero,
|
||||
None,
|
||||
0, // RuntimeLang
|
||||
|
|
@ -1659,7 +1655,7 @@ fn prepare_enum_metadata(
|
|||
file_metadata,
|
||||
UNKNOWN_LINE_NUMBER,
|
||||
size.bits(),
|
||||
align.abi_bits() as u32,
|
||||
align.abi.bits() as u32,
|
||||
layout.fields.offset(0).bits(),
|
||||
DIFlags::FlagArtificial,
|
||||
discr_metadata))
|
||||
|
|
@ -1679,7 +1675,7 @@ fn prepare_enum_metadata(
|
|||
file_metadata,
|
||||
UNKNOWN_LINE_NUMBER,
|
||||
size.bits(),
|
||||
align.abi_bits() as u32,
|
||||
align.bits() as u32,
|
||||
layout.fields.offset(0).bits(),
|
||||
DIFlags::FlagArtificial,
|
||||
discr_metadata))
|
||||
|
|
@ -1695,8 +1691,8 @@ fn prepare_enum_metadata(
|
|||
ptr::null_mut(),
|
||||
file_metadata,
|
||||
UNKNOWN_LINE_NUMBER,
|
||||
enum_type_size.bits(),
|
||||
enum_type_align.abi_bits() as u32,
|
||||
layout.size.bits(),
|
||||
layout.align.abi.bits() as u32,
|
||||
DIFlags::FlagZero,
|
||||
discriminator_metadata,
|
||||
empty_array,
|
||||
|
|
@ -1712,8 +1708,8 @@ fn prepare_enum_metadata(
|
|||
enum_name.as_ptr(),
|
||||
file_metadata,
|
||||
UNKNOWN_LINE_NUMBER,
|
||||
enum_type_size.bits(),
|
||||
enum_type_align.abi_bits() as u32,
|
||||
layout.size.bits(),
|
||||
layout.align.abi.bits() as u32,
|
||||
DIFlags::FlagZero,
|
||||
None,
|
||||
type_array,
|
||||
|
|
@ -1807,7 +1803,7 @@ fn set_members_of_composite_type(cx: &CodegenCx<'ll, '_>,
|
|||
unknown_file_metadata(cx),
|
||||
UNKNOWN_LINE_NUMBER,
|
||||
member_description.size.bits(),
|
||||
member_description.align.abi_bits() as u32,
|
||||
member_description.align.bits() as u32,
|
||||
member_description.offset.bits(),
|
||||
match member_description.discriminant {
|
||||
None => None,
|
||||
|
|
@ -1855,7 +1851,7 @@ fn create_struct_stub(
|
|||
unknown_file_metadata(cx),
|
||||
UNKNOWN_LINE_NUMBER,
|
||||
struct_size.bits(),
|
||||
struct_align.abi_bits() as u32,
|
||||
struct_align.bits() as u32,
|
||||
DIFlags::FlagZero,
|
||||
None,
|
||||
empty_array,
|
||||
|
|
@ -1893,7 +1889,7 @@ fn create_union_stub(
|
|||
unknown_file_metadata(cx),
|
||||
UNKNOWN_LINE_NUMBER,
|
||||
union_size.bits(),
|
||||
union_align.abi_bits() as u32,
|
||||
union_align.bits() as u32,
|
||||
DIFlags::FlagZero,
|
||||
Some(empty_array),
|
||||
0, // RuntimeLang
|
||||
|
|
@ -1962,7 +1958,7 @@ pub fn create_global_var_metadata(
|
|||
is_local_to_unit,
|
||||
global,
|
||||
None,
|
||||
global_align.abi() as u32,
|
||||
global_align.bytes() as u32,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -2000,7 +1996,7 @@ pub fn create_vtable_metadata(
|
|||
unknown_file_metadata(cx),
|
||||
UNKNOWN_LINE_NUMBER,
|
||||
Size::ZERO.bits(),
|
||||
cx.tcx.data_layout.pointer_align.abi_bits() as u32,
|
||||
cx.tcx.data_layout.pointer_align.abi.bits() as u32,
|
||||
DIFlags::FlagArtificial,
|
||||
None,
|
||||
empty_array,
|
||||
|
|
|
|||
|
|
@ -201,7 +201,7 @@ impl DebugInfoBuilderMethods<'tcx> for Builder<'a, 'll, 'tcx> {
|
|||
cx.sess().opts.optimize != config::OptLevel::No,
|
||||
DIFlags::FlagZero,
|
||||
argument_index,
|
||||
align.abi() as u32,
|
||||
align.bytes() as u32,
|
||||
)
|
||||
};
|
||||
source_loc::set_debug_location(self,
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@ impl IntrinsicCallMethods<'tcx> for Builder<'a, 'll, 'tcx> {
|
|||
let name = &*tcx.item_name(def_id).as_str();
|
||||
|
||||
let llret_ty = self.cx().layout_of(ret_ty).llvm_type(self.cx());
|
||||
let result = PlaceRef::new_sized(llresult, fn_ty.ret.layout, fn_ty.ret.layout.align);
|
||||
let result = PlaceRef::new_sized(llresult, fn_ty.ret.layout, fn_ty.ret.layout.align.abi);
|
||||
|
||||
let simple = get_simple_intrinsic(self.cx(), name);
|
||||
let llval = match name {
|
||||
|
|
@ -158,7 +158,7 @@ impl IntrinsicCallMethods<'tcx> for Builder<'a, 'll, 'tcx> {
|
|||
}
|
||||
"min_align_of" => {
|
||||
let tp_ty = substs.type_at(0);
|
||||
self.cx().const_usize(self.cx().align_of(tp_ty).abi())
|
||||
self.cx().const_usize(self.cx().align_of(tp_ty).bytes())
|
||||
}
|
||||
"min_align_of_val" => {
|
||||
let tp_ty = substs.type_at(0);
|
||||
|
|
@ -167,12 +167,12 @@ impl IntrinsicCallMethods<'tcx> for Builder<'a, 'll, 'tcx> {
|
|||
glue::size_and_align_of_dst(self, tp_ty, Some(meta));
|
||||
llalign
|
||||
} else {
|
||||
self.cx().const_usize(self.cx().align_of(tp_ty).abi())
|
||||
self.cx().const_usize(self.cx().align_of(tp_ty).bytes())
|
||||
}
|
||||
}
|
||||
"pref_align_of" => {
|
||||
let tp_ty = substs.type_at(0);
|
||||
self.cx().const_usize(self.cx().align_of(tp_ty).pref())
|
||||
self.cx().const_usize(self.cx().layout_of(tp_ty).align.pref.bytes())
|
||||
}
|
||||
"type_name" => {
|
||||
let tp_ty = substs.type_at(0);
|
||||
|
|
@ -261,7 +261,7 @@ impl IntrinsicCallMethods<'tcx> for Builder<'a, 'll, 'tcx> {
|
|||
let align = if name == "unaligned_volatile_load" {
|
||||
1
|
||||
} else {
|
||||
self.cx().align_of(tp_ty).abi() as u32
|
||||
self.cx().align_of(tp_ty).bytes() as u32
|
||||
};
|
||||
unsafe {
|
||||
llvm::LLVMSetAlignment(load, align);
|
||||
|
|
@ -815,7 +815,7 @@ fn try_intrinsic(
|
|||
) {
|
||||
if bx.cx().sess().no_landing_pads() {
|
||||
bx.call(func, &[data], None);
|
||||
let ptr_align = bx.tcx().data_layout.pointer_align;
|
||||
let ptr_align = bx.tcx().data_layout.pointer_align.abi;
|
||||
bx.store(bx.cx().const_null(bx.cx().type_i8p()), dest, ptr_align);
|
||||
} else if wants_msvc_seh(bx.cx().sess()) {
|
||||
codegen_msvc_try(bx, func, data, local_ptr, dest);
|
||||
|
|
@ -890,7 +890,7 @@ fn codegen_msvc_try(
|
|||
//
|
||||
// More information can be found in libstd's seh.rs implementation.
|
||||
let i64p = bx.cx().type_ptr_to(bx.cx().type_i64());
|
||||
let ptr_align = bx.tcx().data_layout.pointer_align;
|
||||
let ptr_align = bx.tcx().data_layout.pointer_align.abi;
|
||||
let slot = bx.alloca(i64p, "slot", ptr_align);
|
||||
bx.invoke(func, &[data], normal.llbb(), catchswitch.llbb(), None);
|
||||
|
||||
|
|
@ -906,7 +906,7 @@ fn codegen_msvc_try(
|
|||
let funclet = catchpad.catch_pad(cs, &[tydesc, bx.cx().const_i32(0), slot]);
|
||||
let addr = catchpad.load(slot, ptr_align);
|
||||
|
||||
let i64_align = bx.tcx().data_layout.i64_align;
|
||||
let i64_align = bx.tcx().data_layout.i64_align.abi;
|
||||
let arg1 = catchpad.load(addr, i64_align);
|
||||
let val1 = bx.cx().const_i32(1);
|
||||
let gep1 = catchpad.inbounds_gep(addr, &[val1]);
|
||||
|
|
@ -923,7 +923,7 @@ fn codegen_msvc_try(
|
|||
// Note that no invoke is used here because by definition this function
|
||||
// can't panic (that's what it's catching).
|
||||
let ret = bx.call(llfn, &[func, data, local_ptr], None);
|
||||
let i32_align = bx.tcx().data_layout.i32_align;
|
||||
let i32_align = bx.tcx().data_layout.i32_align.abi;
|
||||
bx.store(ret, dest, i32_align);
|
||||
}
|
||||
|
||||
|
|
@ -982,7 +982,7 @@ fn codegen_gnu_try(
|
|||
let vals = catch.landing_pad(lpad_ty, bx.cx().eh_personality(), 1);
|
||||
catch.add_clause(vals, bx.cx().const_null(bx.cx().type_i8p()));
|
||||
let ptr = catch.extract_value(vals, 0);
|
||||
let ptr_align = bx.tcx().data_layout.pointer_align;
|
||||
let ptr_align = bx.tcx().data_layout.pointer_align.abi;
|
||||
let bitcast = catch.bitcast(local_ptr, bx.cx().type_ptr_to(bx.cx().type_i8p()));
|
||||
catch.store(ptr, bitcast, ptr_align);
|
||||
catch.ret(bx.cx().const_i32(1));
|
||||
|
|
@ -991,7 +991,7 @@ fn codegen_gnu_try(
|
|||
// Note that no invoke is used here because by definition this function
|
||||
// can't panic (that's what it's catching).
|
||||
let ret = bx.call(llfn, &[func, data, local_ptr], None);
|
||||
let i32_align = bx.tcx().data_layout.i32_align;
|
||||
let i32_align = bx.tcx().data_layout.i32_align.abi;
|
||||
bx.store(ret, dest, i32_align);
|
||||
}
|
||||
|
||||
|
|
@ -1436,7 +1436,7 @@ fn generic_simd_intrinsic(
|
|||
|
||||
// Alignment of T, must be a constant integer value:
|
||||
let alignment_ty = bx.cx().type_i32();
|
||||
let alignment = bx.cx().const_i32(bx.cx().align_of(in_elem).abi() as i32);
|
||||
let alignment = bx.cx().const_i32(bx.cx().align_of(in_elem).bytes() as i32);
|
||||
|
||||
// Truncate the mask vector to a vector of i1s:
|
||||
let (mask, mask_ty) = {
|
||||
|
|
@ -1536,7 +1536,7 @@ fn generic_simd_intrinsic(
|
|||
|
||||
// Alignment of T, must be a constant integer value:
|
||||
let alignment_ty = bx.cx().type_i32();
|
||||
let alignment = bx.cx().const_i32(bx.cx().align_of(in_elem).abi() as i32);
|
||||
let alignment = bx.cx().const_i32(bx.cx().align_of(in_elem).bytes() as i32);
|
||||
|
||||
// Truncate the mask vector to a vector of i1s:
|
||||
let (mask, mask_ty) = {
|
||||
|
|
|
|||
|
|
@ -80,7 +80,7 @@ fn uncached_llvm_type<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>,
|
|||
|
||||
match layout.fields {
|
||||
layout::FieldPlacement::Union(_) => {
|
||||
let fill = cx.type_padding_filler( layout.size, layout.align);
|
||||
let fill = cx.type_padding_filler(layout.size, layout.align.abi);
|
||||
let packed = false;
|
||||
match name {
|
||||
None => {
|
||||
|
|
@ -120,23 +120,23 @@ fn struct_llfields<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>,
|
|||
|
||||
let mut packed = false;
|
||||
let mut offset = Size::ZERO;
|
||||
let mut prev_effective_align = layout.align;
|
||||
let mut prev_effective_align = layout.align.abi;
|
||||
let mut result: Vec<_> = Vec::with_capacity(1 + field_count * 2);
|
||||
for i in layout.fields.index_by_increasing_offset() {
|
||||
let target_offset = layout.fields.offset(i as usize);
|
||||
let field = layout.field(cx, i);
|
||||
let effective_field_align = layout.align
|
||||
.min(field.align)
|
||||
let effective_field_align = layout.align.abi
|
||||
.min(field.align.abi)
|
||||
.restrict_for_offset(target_offset);
|
||||
packed |= effective_field_align.abi() < field.align.abi();
|
||||
packed |= effective_field_align < field.align.abi;
|
||||
|
||||
debug!("struct_llfields: {}: {:?} offset: {:?} target_offset: {:?} \
|
||||
effective_field_align: {}",
|
||||
i, field, offset, target_offset, effective_field_align.abi());
|
||||
i, field, offset, target_offset, effective_field_align.bytes());
|
||||
assert!(target_offset >= offset);
|
||||
let padding = target_offset - offset;
|
||||
let padding_align = prev_effective_align.min(effective_field_align);
|
||||
assert_eq!(offset.abi_align(padding_align) + padding, target_offset);
|
||||
assert_eq!(offset.align_to(padding_align) + padding, target_offset);
|
||||
result.push(cx.type_padding_filler( padding, padding_align));
|
||||
debug!(" padding before: {:?}", padding);
|
||||
|
||||
|
|
@ -151,7 +151,7 @@ fn struct_llfields<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>,
|
|||
}
|
||||
let padding = layout.size - offset;
|
||||
let padding_align = prev_effective_align;
|
||||
assert_eq!(offset.abi_align(padding_align) + padding, layout.size);
|
||||
assert_eq!(offset.align_to(padding_align) + padding, layout.size);
|
||||
debug!("struct_llfields: pad_bytes: {:?} offset: {:?} stride: {:?}",
|
||||
padding, offset, layout.size);
|
||||
result.push(cx.type_padding_filler(padding, padding_align));
|
||||
|
|
@ -166,7 +166,7 @@ fn struct_llfields<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>,
|
|||
|
||||
impl<'a, 'tcx> CodegenCx<'a, 'tcx> {
|
||||
pub fn align_of(&self, ty: Ty<'tcx>) -> Align {
|
||||
self.layout_of(ty).align
|
||||
self.layout_of(ty).align.abi
|
||||
}
|
||||
|
||||
pub fn size_of(&self, ty: Ty<'tcx>) -> Size {
|
||||
|
|
@ -174,7 +174,8 @@ impl<'a, 'tcx> CodegenCx<'a, 'tcx> {
|
|||
}
|
||||
|
||||
pub fn size_and_align_of(&self, ty: Ty<'tcx>) -> (Size, Align) {
|
||||
self.layout_of(ty).size_and_align()
|
||||
let layout = self.layout_of(ty);
|
||||
(layout.size, layout.align.abi)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -332,7 +333,7 @@ impl<'tcx> LayoutLlvmExt<'tcx> for TyLayout<'tcx> {
|
|||
layout::Pointer => {
|
||||
// If we know the alignment, pick something better than i8.
|
||||
let pointee = if let Some(pointee) = self.pointee_info_at(cx, offset) {
|
||||
cx.type_pointee_for_abi_align( pointee.align)
|
||||
cx.type_pointee_for_align(pointee.align)
|
||||
} else {
|
||||
cx.type_i8()
|
||||
};
|
||||
|
|
@ -376,7 +377,7 @@ impl<'tcx> LayoutLlvmExt<'tcx> for TyLayout<'tcx> {
|
|||
let offset = if index == 0 {
|
||||
Size::ZERO
|
||||
} else {
|
||||
a.value.size(cx).abi_align(b.value.align(cx))
|
||||
a.value.size(cx).align_to(b.value.align(cx).abi)
|
||||
};
|
||||
self.scalar_llvm_type_at(cx, scalar, offset)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue