Set memflags for vtable loads
This commit is contained in:
parent
967709f31a
commit
696053e69f
1 changed files with 10 additions and 4 deletions
|
@ -6,11 +6,17 @@ const DROP_FN_INDEX: usize = 0;
|
||||||
const SIZE_INDEX: usize = 1;
|
const SIZE_INDEX: usize = 1;
|
||||||
const ALIGN_INDEX: usize = 2;
|
const ALIGN_INDEX: usize = 2;
|
||||||
|
|
||||||
|
fn vtable_memflags() -> MemFlags {
|
||||||
|
let mut flags = MemFlags::trusted(); // A vtable access is always aligned and will never trap.
|
||||||
|
flags.set_readonly(); // A vtable is always read-only.
|
||||||
|
flags
|
||||||
|
}
|
||||||
|
|
||||||
pub fn drop_fn_of_obj(fx: &mut FunctionCx<'_, '_, impl Backend>, vtable: Value) -> Value {
|
pub fn drop_fn_of_obj(fx: &mut FunctionCx<'_, '_, impl Backend>, vtable: Value) -> Value {
|
||||||
let usize_size = fx.layout_of(fx.tcx.types.usize).size.bytes() as usize;
|
let usize_size = fx.layout_of(fx.tcx.types.usize).size.bytes() as usize;
|
||||||
fx.bcx.ins().load(
|
fx.bcx.ins().load(
|
||||||
pointer_ty(fx.tcx),
|
pointer_ty(fx.tcx),
|
||||||
MemFlags::new(),
|
vtable_memflags(),
|
||||||
vtable,
|
vtable,
|
||||||
(DROP_FN_INDEX * usize_size) as i32,
|
(DROP_FN_INDEX * usize_size) as i32,
|
||||||
)
|
)
|
||||||
|
@ -20,7 +26,7 @@ pub fn size_of_obj(fx: &mut FunctionCx<'_, '_, impl Backend>, vtable: Value) ->
|
||||||
let usize_size = fx.layout_of(fx.tcx.types.usize).size.bytes() as usize;
|
let usize_size = fx.layout_of(fx.tcx.types.usize).size.bytes() as usize;
|
||||||
fx.bcx.ins().load(
|
fx.bcx.ins().load(
|
||||||
pointer_ty(fx.tcx),
|
pointer_ty(fx.tcx),
|
||||||
MemFlags::new(),
|
vtable_memflags(),
|
||||||
vtable,
|
vtable,
|
||||||
(SIZE_INDEX * usize_size) as i32,
|
(SIZE_INDEX * usize_size) as i32,
|
||||||
)
|
)
|
||||||
|
@ -30,7 +36,7 @@ pub fn min_align_of_obj(fx: &mut FunctionCx<'_, '_, impl Backend>, vtable: Value
|
||||||
let usize_size = fx.layout_of(fx.tcx.types.usize).size.bytes() as usize;
|
let usize_size = fx.layout_of(fx.tcx.types.usize).size.bytes() as usize;
|
||||||
fx.bcx.ins().load(
|
fx.bcx.ins().load(
|
||||||
pointer_ty(fx.tcx),
|
pointer_ty(fx.tcx),
|
||||||
MemFlags::new(),
|
vtable_memflags(),
|
||||||
vtable,
|
vtable,
|
||||||
(ALIGN_INDEX * usize_size) as i32,
|
(ALIGN_INDEX * usize_size) as i32,
|
||||||
)
|
)
|
||||||
|
@ -45,7 +51,7 @@ pub fn get_ptr_and_method_ref<'tcx>(
|
||||||
let usize_size = fx.layout_of(fx.tcx.types.usize).size.bytes();
|
let usize_size = fx.layout_of(fx.tcx.types.usize).size.bytes();
|
||||||
let func_ref = fx.bcx.ins().load(
|
let func_ref = fx.bcx.ins().load(
|
||||||
pointer_ty(fx.tcx),
|
pointer_ty(fx.tcx),
|
||||||
MemFlags::new(),
|
vtable_memflags(),
|
||||||
vtable,
|
vtable,
|
||||||
((idx + 3) * usize_size as usize) as i32,
|
((idx + 3) * usize_size as usize) as i32,
|
||||||
);
|
);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue