about summary refs log tree commit diff
path: root/src/libcore
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2019-10-04 20:33:02 +0000
committerbors <bors@rust-lang.org>2019-10-04 20:33:02 +0000
commit7870050796e5904a0fc85ecbe6fa6dde1cfe0c91 (patch)
tree9a1cd1fe1091eb7e2ddaf1df8f9ea93eb70c6fa2 /src/libcore
parent2e7244807a7878f6eca3eb7d97ae9b413aa49014 (diff)
parent4a4df29d6fa12c303e3991f0e0e3677342c4787c (diff)
downloadrust-7870050796e5904a0fc85ecbe6fa6dde1cfe0c91.tar.gz
rust-7870050796e5904a0fc85ecbe6fa6dde1cfe0c91.zip
Auto merge of #63649 - tlively:emscripten-upstream-upgrade, r=alexcrichton
Upgrade Emscripten targets to use upstream LLVM backend

 - Refactors the Emscripten target spec to share code with other wasm
   targets.
 - Replaces the incorrect wasm32 C call ABI with the old asmjs
   version, which is correct for both wasm32 and JS.
 - Updates the varargs ABI used by Emscripten and deletes the old one.
 - Removes the obsolete wasm32-experimental-emscripten target.
 - Temporarily makes Emscripten targets use panic=abort by default
   because supporting unwinding will require an LLVM patch.
Diffstat (limited to 'src/libcore')
-rw-r--r--src/libcore/ffi.rs56
-rw-r--r--src/libcore/hint.rs16
2 files changed, 18 insertions, 54 deletions
diff --git a/src/libcore/ffi.rs b/src/libcore/ffi.rs
index eda0e7c518c..0ea4187ccd4 100644
--- a/src/libcore/ffi.rs
+++ b/src/libcore/ffi.rs
@@ -49,8 +49,10 @@ impl fmt::Debug for c_void {
 /// Basic implementation of a `va_list`.
 // The name is WIP, using `VaListImpl` for now.
 #[cfg(any(all(not(target_arch = "aarch64"), not(target_arch = "powerpc"),
-              not(target_arch = "x86_64"), not(target_arch = "asmjs")),
+              not(target_arch = "x86_64")),
           all(target_arch = "aarch64", target_os = "ios"),
+          target_arch = "wasm32",
+          target_arch = "asmjs",
           windows))]
 #[repr(transparent)]
 #[unstable(feature = "c_variadic",
@@ -67,8 +69,10 @@ pub struct VaListImpl<'f> {
 }
 
 #[cfg(any(all(not(target_arch = "aarch64"), not(target_arch = "powerpc"),
-              not(target_arch = "x86_64"), not(target_arch = "asmjs")),
+              not(target_arch = "x86_64")),
           all(target_arch = "aarch64", target_os = "ios"),
+          target_arch = "wasm32",
+          target_arch = "asmjs",
           windows))]
 #[unstable(feature = "c_variadic",
            reason = "the `c_variadic` feature has not been properly tested on \
@@ -137,38 +141,6 @@ pub struct VaListImpl<'f> {
     _marker: PhantomData<&'f mut &'f c_void>,
 }
 
-/// asm.js ABI implementation of a `va_list`.
-// asm.js uses the PNaCl ABI, which specifies that a `va_list` is
-// an array of 4 32-bit integers, according to the old PNaCl docs at
-// https://web.archive.org/web/20130518054430/https://www.chromium.org/nativeclient/pnacl/bitcode-abi#TOC-Derived-Types
-// and clang does the same in `CreatePNaClABIBuiltinVaListDecl` from `lib/AST/ASTContext.cpp`
-#[cfg(all(target_arch = "asmjs", not(windows)))]
-#[repr(C)]
-#[unstable(feature = "c_variadic",
-           reason = "the `c_variadic` feature has not been properly tested on \
-                     all supported platforms",
-           issue = "44930")]
-#[lang = "va_list"]
-pub struct VaListImpl<'f> {
-    inner: [crate::mem::MaybeUninit<i32>; 4],
-    _marker: PhantomData<&'f mut &'f c_void>,
-}
-
-#[cfg(all(target_arch = "asmjs", not(windows)))]
-#[unstable(feature = "c_variadic",
-           reason = "the `c_variadic` feature has not been properly tested on \
-                     all supported platforms",
-           issue = "44930")]
-impl<'f> fmt::Debug for VaListImpl<'f> {
-    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        unsafe {
-            write!(f, "va_list* [{:#x}, {:#x}, {:#x}, {:#x}]",
-                   self.inner[0].read(), self.inner[1].read(),
-                   self.inner[2].read(), self.inner[3].read())
-        }
-    }
-}
-
 /// A wrapper for a `va_list`
 #[repr(transparent)]
 #[derive(Debug)]
@@ -178,14 +150,18 @@ impl<'f> fmt::Debug for VaListImpl<'f> {
            issue = "44930")]
 pub struct VaList<'a, 'f: 'a> {
     #[cfg(any(all(not(target_arch = "aarch64"), not(target_arch = "powerpc"),
-                  not(target_arch = "x86_64"), not(target_arch = "asmjs")),
+                  not(target_arch = "x86_64")),
               all(target_arch = "aarch64", target_os = "ios"),
+              target_arch = "wasm32",
+              target_arch = "asmjs",
               windows))]
     inner: VaListImpl<'f>,
 
     #[cfg(all(any(target_arch = "aarch64", target_arch = "powerpc",
-                  target_arch = "x86_64", target_arch = "asmjs"),
+                  target_arch = "x86_64"),
               any(not(target_arch = "aarch64"), not(target_os = "ios")),
+              not(target_arch = "wasm32"),
+              not(target_arch = "asmjs"),
               not(windows)))]
     inner: &'a mut VaListImpl<'f>,
 
@@ -193,8 +169,10 @@ pub struct VaList<'a, 'f: 'a> {
 }
 
 #[cfg(any(all(not(target_arch = "aarch64"), not(target_arch = "powerpc"),
-              not(target_arch = "x86_64"), not(target_arch = "asmjs")),
+              not(target_arch = "x86_64")),
           all(target_arch = "aarch64", target_os = "ios"),
+          target_arch = "wasm32",
+          target_arch = "asmjs",
           windows))]
 #[unstable(feature = "c_variadic",
            reason = "the `c_variadic` feature has not been properly tested on \
@@ -212,8 +190,10 @@ impl<'f> VaListImpl<'f> {
 }
 
 #[cfg(all(any(target_arch = "aarch64", target_arch = "powerpc",
-              target_arch = "x86_64", target_arch = "asmjs"),
+              target_arch = "x86_64"),
           any(not(target_arch = "aarch64"), not(target_os = "ios")),
+          not(target_arch = "wasm32"),
+          not(target_arch = "asmjs"),
           not(windows)))]
 #[unstable(feature = "c_variadic",
            reason = "the `c_variadic` feature has not been properly tested on \
diff --git a/src/libcore/hint.rs b/src/libcore/hint.rs
index ee4be6c9151..368a2f16b28 100644
--- a/src/libcore/hint.rs
+++ b/src/libcore/hint.rs
@@ -114,24 +114,8 @@ 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
-    }
 }