From 696053e69f398ecd395e6a74fd58ba634368f57f Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Fri, 20 Dec 2019 16:16:28 +0100 Subject: [PATCH] Set memflags for vtable loads --- src/vtable.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/vtable.rs b/src/vtable.rs index 155237a402f..c12dff3cdc6 100644 --- a/src/vtable.rs +++ b/src/vtable.rs @@ -6,11 +6,17 @@ const DROP_FN_INDEX: usize = 0; const SIZE_INDEX: usize = 1; 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 { let usize_size = fx.layout_of(fx.tcx.types.usize).size.bytes() as usize; fx.bcx.ins().load( pointer_ty(fx.tcx), - MemFlags::new(), + vtable_memflags(), vtable, (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; fx.bcx.ins().load( pointer_ty(fx.tcx), - MemFlags::new(), + vtable_memflags(), vtable, (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; fx.bcx.ins().load( pointer_ty(fx.tcx), - MemFlags::new(), + vtable_memflags(), vtable, (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 func_ref = fx.bcx.ins().load( pointer_ty(fx.tcx), - MemFlags::new(), + vtable_memflags(), vtable, ((idx + 3) * usize_size as usize) as i32, );