about summary refs log tree commit diff
diff options
context:
space:
mode:
authorkennytm <kennytm@gmail.com>2018-01-23 17:03:36 +0800
committerGitHub <noreply@github.com>2018-01-23 17:03:36 +0800
commit82981a77c45fcdb3c78c80b3e3a265413c934bbb (patch)
tree82f302b1eeaa55bdfde30ce3abd466662b6a058b
parent150f2baca82726eca4b0bc68a070f1b0015e954c (diff)
parent1203b3d892b6f8424f6540173e31af1cda304e36 (diff)
downloadrust-82981a77c45fcdb3c78c80b3e3a265413c934bbb.tar.gz
rust-82981a77c45fcdb3c78c80b3e3a265413c934bbb.zip
Rollup merge of #47541 - psumbera:master, r=eddyb
Fixes sparc64 cabi fixes.

Argument up to 16 bytes size is provided in registers.
Return value up to 32 bytes size is stored in registers.

Fixes: #46679

---

Firefox now (almost) build on sparc. Original rust issue seems to be gone. Note that I'm not rust expert and the fix was suggested in bug.
-rw-r--r--src/librustc_trans/cabi_sparc64.rs7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/librustc_trans/cabi_sparc64.rs b/src/librustc_trans/cabi_sparc64.rs
index fb94b09d626..b3fc6a68061 100644
--- a/src/librustc_trans/cabi_sparc64.rs
+++ b/src/librustc_trans/cabi_sparc64.rs
@@ -50,7 +50,7 @@ fn classify_ret_ty<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>, ret: &mut ArgType<'tcx>)
     }
     let size = ret.layout.size;
     let bits = size.bits();
-    if bits <= 128 {
+    if bits <= 256 {
         let unit = if bits <= 8 {
             Reg::i8()
         } else if bits <= 16 {
@@ -84,6 +84,11 @@ fn classify_arg_ty<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>, arg: &mut ArgType<'tcx>)
     }
 
     let total = arg.layout.size;
+    if total.bits() > 128 {
+        arg.make_indirect();
+        return;
+    }
+
     arg.cast_to(Uniform {
         unit: Reg::i64(),
         total