respect repr(align(N)) on functions in miri
This commit is contained in:
parent
49e5e4e3a5
commit
2d21c14015
2 changed files with 35 additions and 2 deletions
|
|
@ -872,8 +872,20 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
|
|||
|
||||
// # Function pointers
|
||||
// (both global from `alloc_map` and local from `extra_fn_ptr_map`)
|
||||
if self.get_fn_alloc(id).is_some() {
|
||||
return AllocInfo::new(Size::ZERO, Align::ONE, AllocKind::Function, Mutability::Not);
|
||||
if let Some(fn_val) = self.get_fn_alloc(id) {
|
||||
let align = match fn_val {
|
||||
FnVal::Instance(instance) => {
|
||||
// Function alignment can be set globally with the `-Zmin-function-alignment=<n>` flag;
|
||||
// the alignment from a `#[repr(align(<n>))]` is used if it specifies a higher alignment.
|
||||
let fn_align = self.tcx.codegen_fn_attrs(instance.def_id()).alignment;
|
||||
let global_align = self.tcx.sess.opts.unstable_opts.min_function_alignment;
|
||||
|
||||
Ord::max(global_align, fn_align).unwrap_or(Align::ONE)
|
||||
}
|
||||
FnVal::Other(_) => Align::ONE,
|
||||
};
|
||||
|
||||
return AllocInfo::new(Size::ZERO, align, AllocKind::Function, Mutability::Not);
|
||||
}
|
||||
|
||||
// # Global allocations
|
||||
|
|
|
|||
21
src/tools/miri/tests/pass/fn_align.rs
Normal file
21
src/tools/miri/tests/pass/fn_align.rs
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
//@compile-flags: -Zmin-function-alignment=8
|
||||
#![feature(fn_align)]
|
||||
|
||||
// When a function uses `repr(align(N))`, the function address should be a multiple of `N`.
|
||||
|
||||
#[repr(align(256))]
|
||||
fn foo() {}
|
||||
|
||||
#[repr(align(16))]
|
||||
fn bar() {}
|
||||
|
||||
#[repr(align(4))]
|
||||
fn baz() {}
|
||||
|
||||
fn main() {
|
||||
assert!((foo as usize).is_multiple_of(256));
|
||||
assert!((bar as usize).is_multiple_of(16));
|
||||
|
||||
// The maximum of `repr(align(N))` and `-Zmin-function-alignment=N` is used.
|
||||
assert!((baz as usize).is_multiple_of(8));
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue