From faf6b84304dbc96f7bf142973f394f820e390a4c Mon Sep 17 00:00:00 2001 From: Alexey Tarasov Date: Sun, 13 Aug 2017 19:28:04 +1000 Subject: [PATCH] Addresses comments in PR #43836 - removes warnings introduced in changeset 0cd3587 - makes documentation more neat and grammatically correct --- src/libcore/ptr.rs | 18 +++--- src/librustc_trans/intrinsic.rs | 46 +-------------- src/test/{ui => run-pass}/issue-39827.rs | 5 ++ src/test/ui/issue-39827.stderr | 73 ------------------------ 4 files changed, 16 insertions(+), 126 deletions(-) rename src/test/{ui => run-pass}/issue-39827.rs (89%) delete mode 100644 src/test/ui/issue-39827.stderr diff --git a/src/libcore/ptr.rs b/src/libcore/ptr.rs index b37e3a5236d..e35777d222c 100644 --- a/src/libcore/ptr.rs +++ b/src/libcore/ptr.rs @@ -384,11 +384,10 @@ pub unsafe fn write_unaligned(dst: *mut T, src: T) { /// over time. That being said, the semantics will almost always end up pretty /// similar to [C11's definition of volatile][c11]. /// -/// Compiler shouldn't change relative order or number of volatile memory -/// operations, however this implies that memory operation actually takes place. -/// If a zero-sized type is used in a specialisation of `read_volatile`, value -/// is known at any time and can not be modified outside of program control. -/// In this case such operation may be omitted by compiler backend. +/// The compiler shouldn't change the relative order or number of volatile +/// memory operations. However, volatile memory operations on zero-sized types +/// (e.g. if a zero-sized type is passed to `read_volatile`) are no-ops +/// and may be ignored. /// /// [c11]: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf /// @@ -433,11 +432,10 @@ pub unsafe fn read_volatile(src: *const T) -> T { /// over time. That being said, the semantics will almost always end up pretty /// similar to [C11's definition of volatile][c11]. /// -/// Compiler shouldn't change relative order or number of volatile memory -/// operations, however this implies that memory operation actually takes place. -/// If a zero-sized type is used in a specialisation of `write_volatile`, value -/// is known at any time and can not be modified outside of program control. -/// In this case such operation may be omitted by compiler backend. +/// The compiler shouldn't change the relative order or number of volatile +/// memory operations. However, volatile memory operations on zero-sized types +/// (e.g. if a zero-sized type is passed to `write_volatile`) are no-ops +/// and may be ignored. /// /// [c11]: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf /// diff --git a/src/librustc_trans/intrinsic.rs b/src/librustc_trans/intrinsic.rs index 5ebd9bed5c8..033ef988571 100644 --- a/src/librustc_trans/intrinsic.rs +++ b/src/librustc_trans/intrinsic.rs @@ -83,38 +83,6 @@ fn get_simple_intrinsic(ccx: &CrateContext, name: &str) -> Option { Some(ccx.get_intrinsic(&llvm_name)) } -fn warn_if_size_is_weird<'a, 'tcx>(bcx: &Builder<'a, 'tcx>, - tp_ty: Ty<'tcx>, - count: ValueRef, - span: Span, - name: &str) { - let ccx = bcx.ccx; - let lltp_ty = type_of::type_of(ccx, tp_ty); - let ty_size = machine::llsize_of(ccx, lltp_ty); - let total = const_to_uint( bcx.mul(ty_size, count) ); - - if total > 0 { - return; - } - - let text = format!("suspicious monomorphization of `{}` intrinsic", name); - let note = match name - { - "volatile_load" | "volatile_store" => - format!("'{}' was specialized with zero-sized type '{}'", - name, tp_ty), - _ => format!("'{}' was specialized with type '{}', number of \ - elements is {}", - name, tp_ty, - const_to_uint(count)) - }; - - let sess = bcx.sess(); - sess.struct_span_warn(span, &text) - .note(¬e) - .emit(); -} - /// Remember to add all intrinsics here, in librustc_typeck/check/mod.rs, /// and in libcore/intrinsics.rs; if you need access to any llvm intrinsics, /// add them to librustc_trans/trans/context.rs @@ -249,24 +217,17 @@ pub fn trans_intrinsic_call<'a, 'tcx>(bcx: &Builder<'a, 'tcx>, } "volatile_copy_nonoverlapping_memory" => { - let tp_ty = substs.type_at(0); - warn_if_size_is_weird(bcx, tp_ty, llargs[2], span, name); - copy_intrinsic(bcx, false, true, tp_ty, llargs[0], llargs[1], llargs[2]) + copy_intrinsic(bcx, false, true, substs.type_at(0), llargs[0], llargs[1], llargs[2]) } "volatile_copy_memory" => { - let tp_ty = substs.type_at(0); - warn_if_size_is_weird(bcx, tp_ty, llargs[2], span, name); - copy_intrinsic(bcx, true, true, tp_ty, llargs[0], llargs[1], llargs[2]) + copy_intrinsic(bcx, true, true, substs.type_at(0), llargs[0], llargs[1], llargs[2]) } "volatile_set_memory" => { - let tp_ty = substs.type_at(0); - warn_if_size_is_weird(bcx, tp_ty, llargs[2], span, name); - memset_intrinsic(bcx, true, tp_ty, llargs[0], llargs[1], llargs[2]) + memset_intrinsic(bcx, true, substs.type_at(0), llargs[0], llargs[1], llargs[2]) } "volatile_load" => { let tp_ty = substs.type_at(0); let mut ptr = llargs[0]; - warn_if_size_is_weird(bcx, tp_ty, C_uint(ccx,1usize), span, name); if let Some(ty) = fn_ty.ret.cast { ptr = bcx.pointercast(ptr, ty.ptr_to()); } @@ -278,7 +239,6 @@ pub fn trans_intrinsic_call<'a, 'tcx>(bcx: &Builder<'a, 'tcx>, }, "volatile_store" => { let tp_ty = substs.type_at(0); - warn_if_size_is_weird(bcx, tp_ty, C_uint(ccx,1usize), span, name); if type_is_fat_ptr(bcx.ccx, tp_ty) { bcx.volatile_store(llargs[1], get_dataptr(bcx, llargs[0])); bcx.volatile_store(llargs[2], get_meta(bcx, llargs[0])); diff --git a/src/test/ui/issue-39827.rs b/src/test/run-pass/issue-39827.rs similarity index 89% rename from src/test/ui/issue-39827.rs rename to src/test/run-pass/issue-39827.rs index 86a3f67b40a..b753cf5844f 100644 --- a/src/test/ui/issue-39827.rs +++ b/src/test/run-pass/issue-39827.rs @@ -13,6 +13,11 @@ use std::intrinsics::{ volatile_copy_memory, volatile_store, volatile_load, volatile_copy_nonoverlapping_memory, volatile_set_memory }; +// +// This test ensures that volatile intrinsics can be specialised with +// zero-sized types and, in case of copy/set functions, can accept +// number of elements equal to zero. +// fn main () { let mut dst_pair = (1, 2); let src_pair = (3, 4); diff --git a/src/test/ui/issue-39827.stderr b/src/test/ui/issue-39827.stderr deleted file mode 100644 index 228309872f9..00000000000 --- a/src/test/ui/issue-39827.stderr +++ /dev/null @@ -1,73 +0,0 @@ -warning: suspicious monomorphization of `volatile_copy_memory` intrinsic - --> $DIR/issue-39827.rs:26:9 - | -26 | volatile_copy_memory(&mut dst_pair, &dst_pair, COUNT_0); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: 'volatile_copy_memory' was specialized with type '(i32, i32)', number of elements is 0 - -warning: suspicious monomorphization of `volatile_copy_nonoverlapping_memory` intrinsic - --> $DIR/issue-39827.rs:27:9 - | -27 | volatile_copy_nonoverlapping_memory(&mut dst_pair, &src_pair, 0); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: 'volatile_copy_nonoverlapping_memory' was specialized with type '(i32, i32)', number of elements is 0 - -warning: suspicious monomorphization of `volatile_copy_memory` intrinsic - --> $DIR/issue-39827.rs:28:9 - | -28 | volatile_copy_memory(&mut dst_empty, &dst_empty, 100); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: 'volatile_copy_memory' was specialized with type '()', number of elements is 100 - -warning: suspicious monomorphization of `volatile_copy_nonoverlapping_memory` intrinsic - --> $DIR/issue-39827.rs:29:9 - | -29 | / volatile_copy_nonoverlapping_memory(&mut dst_empty, &src_empty, -30 | | COUNT_100); - | |______________________________________________________^ - | - = note: 'volatile_copy_nonoverlapping_memory' was specialized with type '()', number of elements is 100 - -warning: suspicious monomorphization of `volatile_set_memory` intrinsic - --> $DIR/issue-39827.rs:31:9 - | -31 | volatile_set_memory(&mut dst_empty, 0, COUNT_100); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: 'volatile_set_memory' was specialized with type '()', number of elements is 100 - -warning: suspicious monomorphization of `volatile_set_memory` intrinsic - --> $DIR/issue-39827.rs:32:9 - | -32 | volatile_set_memory(&mut dst_pair, 0, COUNT_0); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: 'volatile_set_memory' was specialized with type '(i32, i32)', number of elements is 0 - -warning: suspicious monomorphization of `volatile_store` intrinsic - --> $DIR/issue-39827.rs:33:9 - | -33 | volatile_store(&mut dst_empty, ()); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: 'volatile_store' was specialized with zero-sized type '()' - -warning: suspicious monomorphization of `volatile_store` intrinsic - --> $DIR/issue-39827.rs:34:9 - | -34 | volatile_store(&mut dst_empty, src_empty); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: 'volatile_store' was specialized with zero-sized type '()' - -warning: suspicious monomorphization of `volatile_load` intrinsic - --> $DIR/issue-39827.rs:35:9 - | -35 | volatile_load(&src_empty); - | ^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: 'volatile_load' was specialized with zero-sized type '()' -