about summary refs log tree commit diff
path: root/src/librustc_target/spec
diff options
context:
space:
mode:
authorThomas Lively <tlively@google.com>2019-08-16 22:08:01 -0700
committerThomas Lively <tlively@google.com>2019-10-04 00:47:21 -0700
commit9a55103b985fdd4a7d90db5d46ebaf0a9e34b419 (patch)
tree1cdfd7878ca16c941679737495dd08416c610956 /src/librustc_target/spec
parent31d75c4e9c5318e880601d3c2cc71e5df094a120 (diff)
downloadrust-9a55103b985fdd4a7d90db5d46ebaf0a9e34b419.tar.gz
rust-9a55103b985fdd4a7d90db5d46ebaf0a9e34b419.zip
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/librustc_target/spec')
-rw-r--r--src/librustc_target/spec/asmjs_unknown_emscripten.rs44
-rw-r--r--src/librustc_target/spec/mod.rs1
-rw-r--r--src/librustc_target/spec/wasm32_experimental_emscripten.rs44
-rw-r--r--src/librustc_target/spec/wasm32_unknown_emscripten.rs39
4 files changed, 26 insertions, 102 deletions
diff --git a/src/librustc_target/spec/asmjs_unknown_emscripten.rs b/src/librustc_target/spec/asmjs_unknown_emscripten.rs
index 6dc140cf160..e8f9c1f3d61 100644
--- a/src/librustc_target/spec/asmjs_unknown_emscripten.rs
+++ b/src/librustc_target/spec/asmjs_unknown_emscripten.rs
@@ -1,40 +1,10 @@
-use super::{LinkArgs, LinkerFlavor, Target, TargetOptions};
+use super::{LinkerFlavor, Target, wasm32_unknown_emscripten};
 
 pub fn target() -> Result<Target, String> {
-    let mut args = LinkArgs::new();
-    args.insert(LinkerFlavor::Em,
-                vec!["-s".to_string(),
-                     "ERROR_ON_UNDEFINED_SYMBOLS=1".to_string(),
-                     "-s".to_string(),
-                     "ABORTING_MALLOC=0".to_string(),
-                     "-s".to_string(),
-                     "WASM=0".to_string()]);
-
-    let opts = TargetOptions {
-        dynamic_linking: false,
-        executables: true,
-        exe_suffix: ".js".to_string(),
-        linker_is_gnu: true,
-        allow_asm: false,
-        obj_is_bitcode: true,
-        is_like_emscripten: true,
-        max_atomic_width: Some(32),
-        post_link_args: args,
-        target_family: Some("unix".to_string()),
-        codegen_backend: "emscripten".to_string(),
-        .. Default::default()
-    };
-    Ok(Target {
-        llvm_target: "asmjs-unknown-emscripten".to_string(),
-        target_endian: "little".to_string(),
-        target_pointer_width: "32".to_string(),
-        target_c_int_width: "32".to_string(),
-        target_os: "emscripten".to_string(),
-        target_env: String::new(),
-        target_vendor: "unknown".to_string(),
-        data_layout: "e-p:32:32-i64:64-v128:32:128-n32-S128".to_string(),
-        arch: "asmjs".to_string(),
-        linker_flavor: LinkerFlavor::Em,
-        options: opts,
-    })
+    let mut target = wasm32_unknown_emscripten::target()?;
+    target.options.post_link_args
+        .entry(LinkerFlavor::Em)
+        .or_default()
+        .extend(vec!["-s".to_string(), "WASM=0".to_string()]);
+    Ok(target)
 }
diff --git a/src/librustc_target/spec/mod.rs b/src/librustc_target/spec/mod.rs
index 25add0cc6a4..cf1a84dec97 100644
--- a/src/librustc_target/spec/mod.rs
+++ b/src/librustc_target/spec/mod.rs
@@ -462,7 +462,6 @@ supported_targets! {
     ("wasm32-unknown-emscripten", wasm32_unknown_emscripten),
     ("wasm32-unknown-unknown", wasm32_unknown_unknown),
     ("wasm32-wasi", wasm32_wasi),
-    ("wasm32-experimental-emscripten", wasm32_experimental_emscripten),
 
     ("thumbv6m-none-eabi", thumbv6m_none_eabi),
     ("thumbv7m-none-eabi", thumbv7m_none_eabi),
diff --git a/src/librustc_target/spec/wasm32_experimental_emscripten.rs b/src/librustc_target/spec/wasm32_experimental_emscripten.rs
deleted file mode 100644
index b802bee25ae..00000000000
--- a/src/librustc_target/spec/wasm32_experimental_emscripten.rs
+++ /dev/null
@@ -1,44 +0,0 @@
-use super::{LinkArgs, LinkerFlavor, Target, TargetOptions};
-
-pub fn target() -> Result<Target, String> {
-    let mut post_link_args = LinkArgs::new();
-    post_link_args.insert(LinkerFlavor::Em,
-                          vec!["-s".to_string(),
-                               "WASM=1".to_string(),
-                               "-s".to_string(),
-                               "ASSERTIONS=1".to_string(),
-                               "-s".to_string(),
-                               "ERROR_ON_UNDEFINED_SYMBOLS=1".to_string(),
-                               "-g3".to_string()]);
-
-    let opts = TargetOptions {
-        dynamic_linking: false,
-        executables: true,
-        // Today emcc emits two files - a .js file to bootstrap and
-        // possibly interpret the wasm, and a .wasm file
-        exe_suffix: ".js".to_string(),
-        linker_is_gnu: true,
-        link_env: vec![("EMCC_WASM_BACKEND".to_string(), "1".to_string())],
-        allow_asm: false,
-        obj_is_bitcode: true,
-        is_like_emscripten: true,
-        max_atomic_width: Some(32),
-        post_link_args,
-        limit_rdylib_exports: false,
-        target_family: Some("unix".to_string()),
-        .. Default::default()
-    };
-    Ok(Target {
-        llvm_target: "wasm32-unknown-unknown".to_string(),
-        target_endian: "little".to_string(),
-        target_pointer_width: "32".to_string(),
-        target_c_int_width: "32".to_string(),
-        target_os: "emscripten".to_string(),
-        target_env: String::new(),
-        target_vendor: "unknown".to_string(),
-        data_layout: "e-m:e-p:32:32-i64:64-n32:64-S128".to_string(),
-        arch: "wasm32".to_string(),
-        linker_flavor: LinkerFlavor::Em,
-        options: opts,
-    })
-}
diff --git a/src/librustc_target/spec/wasm32_unknown_emscripten.rs b/src/librustc_target/spec/wasm32_unknown_emscripten.rs
index e0df36884bf..90f3d2fc52d 100644
--- a/src/librustc_target/spec/wasm32_unknown_emscripten.rs
+++ b/src/librustc_target/spec/wasm32_unknown_emscripten.rs
@@ -1,45 +1,44 @@
-use super::{LinkArgs, LinkerFlavor, Target, TargetOptions};
+use super::wasm32_base;
+use super::{LinkArgs, LinkerFlavor, Target, TargetOptions, PanicStrategy};
 
 pub fn target() -> Result<Target, String> {
-    // FIXME(nikic) BINARYEN_TRAP_MODE=clamp is needed to avoid trapping in our
-    // -Zsaturating-float-casts implementation. This can be dropped if/when
-    // we have native fpto[su]i.sat intrinsics, or the implementation otherwise
-    // stops relying on non-trapping fpto[su]i.
     let mut post_link_args = LinkArgs::new();
     post_link_args.insert(LinkerFlavor::Em,
                           vec!["-s".to_string(),
-                               "BINARYEN=1".to_string(),
-                               "-s".to_string(),
                                "ERROR_ON_UNDEFINED_SYMBOLS=1".to_string(),
                                "-s".to_string(),
-                               "BINARYEN_TRAP_MODE='clamp'".to_string()]);
+                               "ASSERTIONS=1".to_string(),
+                               "-s".to_string(),
+                               "DISABLE_EXCEPTION_CATCHING=1".to_string(),
+                               // FIXME(tlively): Enable this linker option once libc type errors
+                               // are resolved. See https://github.com/rust-lang/libc/pull/1478.
+                               // "-Wl,--fatal-warnings".to_string(),
+                               ]);
 
     let opts = TargetOptions {
-        dynamic_linking: false,
-        executables: true,
-        // Today emcc emits two files - a .js file to bootstrap and
-        // possibly interpret the wasm, and a .wasm file
+        // emcc emits two files - a .js file to instantiate the wasm and supply platform
+        // functionality, and a .wasm file.
         exe_suffix: ".js".to_string(),
+        linker: None,
         linker_is_gnu: true,
-        allow_asm: false,
-        obj_is_bitcode: true,
         is_like_emscripten: true,
-        max_atomic_width: Some(32),
+        // FIXME(tlively): Emscripten supports unwinding, but we would have to pass
+        // -enable-emscripten-cxx-exceptions to LLVM at codegen time and merge
+        // https://reviews.llvm.org/rG5c3cdef84b82464756bb571c13c31cf7773860c3to use it.
+        panic_strategy: PanicStrategy::Abort,
         post_link_args,
-        limit_rdylib_exports: false,
         target_family: Some("unix".to_string()),
-        codegen_backend: "emscripten".to_string(),
-        .. Default::default()
+        .. wasm32_base::options()
     };
     Ok(Target {
-        llvm_target: "asmjs-unknown-emscripten".to_string(),
+        llvm_target: "wasm32-unknown-emscripten".to_string(),
         target_endian: "little".to_string(),
         target_pointer_width: "32".to_string(),
         target_c_int_width: "32".to_string(),
         target_os: "emscripten".to_string(),
         target_env: String::new(),
         target_vendor: "unknown".to_string(),
-        data_layout: "e-p:32:32-i64:64-v128:32:128-n32-S128".to_string(),
+        data_layout: "e-m:e-p:32:32-i64:64-n32:64-S128".to_string(),
         arch: "wasm32".to_string(),
         linker_flavor: LinkerFlavor::Em,
         options: opts,