aboutsummaryrefslogtreecommitdiff
path: root/gcc/calls.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2003-01-20 15:20:18 -0800
committerRichard Henderson <rth@gcc.gnu.org>2003-01-20 15:20:18 -0800
commita4b1b92af3fa1384872bcf78966cc93ea68c752e (patch)
tree0e621df774f2b6ae7e3e0299e68ea6fb231b0044 /gcc/calls.c
parentd530b07f81e389fde99a626460ea3b33a34b9a83 (diff)
downloadgcc-a4b1b92af3fa1384872bcf78966cc93ea68c752e.zip
gcc-a4b1b92af3fa1384872bcf78966cc93ea68c752e.tar.gz
gcc-a4b1b92af3fa1384872bcf78966cc93ea68c752e.tar.bz2
expr.h (MUST_PASS_IN_STACK): Move implementation...
* expr.h (MUST_PASS_IN_STACK): Move implementation... * calls.c (default_must_pass_in_stack): ... here. From-SVN: r61514
Diffstat (limited to 'gcc/calls.c')
-rw-r--r--gcc/calls.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/gcc/calls.c b/gcc/calls.c
index 52b5fc3..8296b84 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -4656,3 +4656,48 @@ store_one_arg (arg, argblock, flags, variable_size, reg_parm_stack_space)
return sibcall_failure;
}
+
+
+/* Nonzero if we do not know how to pass TYPE solely in registers.
+ We cannot do so in the following cases:
+
+ - if the type has variable size
+ - if the type is marked as addressable (it is required to be constructed
+ into the stack)
+ - if the padding and mode of the type is such that a copy into a register
+ would put it into the wrong part of the register.
+
+ Which padding can't be supported depends on the byte endianness.
+
+ A value in a register is implicitly padded at the most significant end.
+ On a big-endian machine, that is the lower end in memory.
+ So a value padded in memory at the upper end can't go in a register.
+ For a little-endian machine, the reverse is true. */
+
+bool
+default_must_pass_in_stack (mode, type)
+ enum machine_mode mode;
+ tree type;
+{
+ if (!type)
+ return true;
+
+ /* If the type has variable size... */
+ if (TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
+ return true;
+
+ /* If the type is marked as addressable (it is required
+ to be constructed into the stack)... */
+ if (TREE_ADDRESSABLE (type))
+ return true;
+
+ /* If the padding and mode of the type is such that a copy into
+ a register would put it into the wrong part of the register. */
+ if (mode == BLKmode
+ && int_size_in_bytes (type) % (PARM_BOUNDARY / BITS_PER_UNIT)
+ && (FUNCTION_ARG_PADDING (mode, type)
+ == (BYTES_BIG_ENDIAN ? upward : downward)))
+ return true;
+
+ return false;
+}