about summary refs log tree commit diff
path: root/src/librustc_target
diff options
context:
space:
mode:
authorThomas Lively <tlively@google.com>2019-10-02 11:02:25 -0700
committerThomas Lively <tlively@google.com>2019-10-04 00:47:21 -0700
commit5b56c660c9cf55b240d26854fa0ffd41db068ff9 (patch)
tree03bc9b23e0f08f0f94054e85d64672a769c7e339 /src/librustc_target
parent9a55103b985fdd4a7d90db5d46ebaf0a9e34b419 (diff)
downloadrust-5b56c660c9cf55b240d26854fa0ffd41db068ff9.tar.gz
rust-5b56c660c9cf55b240d26854fa0ffd41db068ff9.zip
Fix ABI, run and fix more tests, re-enable CI for PRs
Diffstat (limited to 'src/librustc_target')
-rw-r--r--src/librustc_target/abi/call/wasm32.rs38
-rw-r--r--src/librustc_target/spec/wasm32_unknown_emscripten.rs2
2 files changed, 30 insertions, 10 deletions
diff --git a/src/librustc_target/abi/call/wasm32.rs b/src/librustc_target/abi/call/wasm32.rs
index 698da2a3aaa..27799edab91 100644
--- a/src/librustc_target/abi/call/wasm32.rs
+++ b/src/librustc_target/abi/call/wasm32.rs
@@ -1,29 +1,47 @@
 use crate::abi::call::{FnType, ArgType, Uniform};
 use crate::abi::{HasDataLayout, LayoutOf, TyLayout, TyLayoutMethods};
 
-fn classify_ret_ty<'a, Ty, C>(cx: &C, ret: &mut ArgType<'a, Ty>)
+fn unwrap_trivial_aggregate<'a, Ty, C>(cx: &C, val: &mut ArgType<'a, Ty>) -> bool
     where Ty: TyLayoutMethods<'a, C> + Copy,
           C: LayoutOf<Ty = Ty, TyLayout = TyLayout<'a, Ty>> + HasDataLayout
 {
-    if ret.layout.is_aggregate() {
-        if let Some(unit) = ret.layout.homogeneous_aggregate(cx).unit() {
-            let size = ret.layout.size;
+    if val.layout.is_aggregate() {
+        if let Some(unit) = val.layout.homogeneous_aggregate(cx).unit() {
+            let size = val.layout.size;
             if unit.size == size {
-                ret.cast_to(Uniform {
+                val.cast_to(Uniform {
                     unit,
                     total: size
                 });
-                return;
+                return true;
             }
         }
+    }
+    false
+}
 
-        ret.make_indirect();
+
+fn classify_ret_ty<'a, Ty, C>(cx: &C, ret: &mut ArgType<'a, Ty>)
+    where Ty: TyLayoutMethods<'a, C> + Copy,
+          C: LayoutOf<Ty = Ty, TyLayout = TyLayout<'a, Ty>> + HasDataLayout
+{
+    ret.extend_integer_width_to(32);
+    if ret.layout.is_aggregate() {
+        if !unwrap_trivial_aggregate(cx, ret) {
+            ret.make_indirect();
+        }
     }
 }
 
-fn classify_arg_ty<Ty>(arg: &mut ArgType<'_, Ty>) {
+fn classify_arg_ty<'a, Ty, C>(cx: &C, arg: &mut ArgType<'a, Ty>)
+    where Ty: TyLayoutMethods<'a, C> + Copy,
+          C: LayoutOf<Ty = Ty, TyLayout = TyLayout<'a, Ty>> + HasDataLayout
+{
+    arg.extend_integer_width_to(32);
     if arg.layout.is_aggregate() {
-        arg.make_indirect_byval();
+        if !unwrap_trivial_aggregate(cx, arg) {
+            arg.make_indirect_byval();
+        }
     }
 }
 
@@ -37,6 +55,6 @@ pub fn compute_abi_info<'a, Ty, C>(cx: &C, fty: &mut FnType<'a, Ty>)
 
     for arg in &mut fty.args {
         if arg.is_ignore() { continue; }
-        classify_arg_ty(arg);
+        classify_arg_ty(cx, arg);
     }
 }
diff --git a/src/librustc_target/spec/wasm32_unknown_emscripten.rs b/src/librustc_target/spec/wasm32_unknown_emscripten.rs
index 90f3d2fc52d..6a2c8c49537 100644
--- a/src/librustc_target/spec/wasm32_unknown_emscripten.rs
+++ b/src/librustc_target/spec/wasm32_unknown_emscripten.rs
@@ -10,6 +10,8 @@ pub fn target() -> Result<Target, String> {
                                "ASSERTIONS=1".to_string(),
                                "-s".to_string(),
                                "DISABLE_EXCEPTION_CATCHING=1".to_string(),
+                               "-s".to_string(),
+                               "ABORTING_MALLOC=0".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(),