about summary refs log tree commit diff
path: root/compiler/rustc_target
diff options
context:
space:
mode:
authorJonas Schievink <jonasschievink@gmail.com>2020-09-21 23:01:31 +0200
committerJonas Schievink <jonasschievink@gmail.com>2020-09-26 15:34:26 +0200
commit4c5acc4ed72f2cd6cf4d2c4ca682d52a117a98d0 (patch)
treec2dad4e1252a49620c472d2746a1a5c3e23c9e30 /compiler/rustc_target
parent6f9a8a7f9b9732c55511d2a2a3914e8feafc7c52 (diff)
downloadrust-4c5acc4ed72f2cd6cf4d2c4ca682d52a117a98d0.tar.gz
rust-4c5acc4ed72f2cd6cf4d2c4ca682d52a117a98d0.zip
Return values up to 128 bits in registers
Diffstat (limited to 'compiler/rustc_target')
-rw-r--r--compiler/rustc_target/src/abi/call/mod.rs12
1 files changed, 12 insertions, 0 deletions
diff --git a/compiler/rustc_target/src/abi/call/mod.rs b/compiler/rustc_target/src/abi/call/mod.rs
index 8f7e2bba5aa..602c424a043 100644
--- a/compiler/rustc_target/src/abi/call/mod.rs
+++ b/compiler/rustc_target/src/abi/call/mod.rs
@@ -610,3 +610,15 @@ impl<'a, Ty> FnAbi<'a, Ty> {
         Ok(())
     }
 }
+
+/// Returns the maximum size of return values to be passed by value in the Rust ABI.
+///
+/// Return values beyond this size will use an implicit out-pointer instead.
+pub fn max_ret_by_val<C: HasTargetSpec + HasDataLayout>(spec: &C) -> Size {
+    match spec.target_spec().arch.as_str() {
+        // System-V will pass return values up to 128 bits in RAX/RDX.
+        "x86_64" => Size::from_bits(128),
+
+        _ => spec.data_layout().pointer_size,
+    }
+}