about summary refs log tree commit diff
path: root/src/libcore/hint.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/libcore/hint.rs')
-rw-r--r--src/libcore/hint.rs16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/libcore/hint.rs b/src/libcore/hint.rs
index 368a2f16b28..ee4be6c9151 100644
--- a/src/libcore/hint.rs
+++ b/src/libcore/hint.rs
@@ -114,8 +114,24 @@ pub fn black_box<T>(dummy: T) -> T {
     // this. LLVM's intepretation of inline assembly is that it's, well, a black
     // box. This isn't the greatest implementation since it probably deoptimizes
     // more than we want, but it's so far good enough.
+    #[cfg(not(any(
+        target_arch = "asmjs",
+        all(
+            target_arch = "wasm32",
+            target_os = "emscripten"
+        )
+    )))]
     unsafe {
         asm!("" : : "r"(&dummy));
         return dummy;
     }
+
+    // Not all platforms support inline assembly so try to do something without
+    // inline assembly which in theory still hinders at least some optimizations
+    // on those targets. This is the "best effort" scenario.
+    unsafe {
+        let ret = crate::ptr::read_volatile(&dummy);
+        crate::mem::forget(dummy);
+        ret
+    }
 }