mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-01-11 05:24:32 +08:00
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
This commit is contained in:
parent
d530b07f81
commit
a4b1b92af3
@ -1,3 +1,8 @@
|
||||
2003-01-20 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* expr.h (MUST_PASS_IN_STACK): Move implementation...
|
||||
* calls.c (default_must_pass_in_stack): ... here.
|
||||
|
||||
2003-01-20 Vladimir Makarov <vmakarov@redhat.com>
|
||||
|
||||
* genattrtab.h (INSN_ALTS_FUNC_NAME): Move it from genautomata.c.
|
||||
|
45
gcc/calls.c
45
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;
|
||||
}
|
||||
|
29
gcc/expr.h
29
gcc/expr.h
@ -153,33 +153,10 @@ enum direction {none, upward, downward}; /* Value has this type. */
|
||||
#define PRETEND_OUTGOING_VARARGS_NAMED 0
|
||||
#endif
|
||||
|
||||
/* 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. */
|
||||
|
||||
/* Nonzero if we do not know how to pass TYPE solely in registers. */
|
||||
#ifndef MUST_PASS_IN_STACK
|
||||
#define MUST_PASS_IN_STACK(MODE,TYPE) \
|
||||
((TYPE) != 0 \
|
||||
&& (TREE_CODE (TYPE_SIZE (TYPE)) != INTEGER_CST \
|
||||
|| TREE_ADDRESSABLE (TYPE) \
|
||||
|| ((MODE) == BLKmode \
|
||||
&& ! ((TYPE) != 0 && TREE_CODE (TYPE_SIZE (TYPE)) == INTEGER_CST \
|
||||
&& 0 == (int_size_in_bytes (TYPE) \
|
||||
% (PARM_BOUNDARY / BITS_PER_UNIT))) \
|
||||
&& (FUNCTION_ARG_PADDING (MODE, TYPE) \
|
||||
== (BYTES_BIG_ENDIAN ? upward : downward)))))
|
||||
extern bool default_must_pass_in_stack PARAMS((enum machine_mode, tree));
|
||||
#define MUST_PASS_IN_STACK(MODE,TYPE) default_must_pass_in_stack(MODE, TYPE)
|
||||
#endif
|
||||
|
||||
/* Nonzero if type TYPE should be returned in memory.
|
||||
|
Loading…
Reference in New Issue
Block a user