Fix APCS violation.

From-SVN: r30087
This commit is contained in:
Richard Earnshaw 1999-10-19 14:27:00 +00:00 committed by Nick Clifton
parent db025289c4
commit 3a2ea2588f
2 changed files with 24 additions and 7 deletions

View file

@ -1,3 +1,8 @@
Tue Oct 19 15:26:11 1999 Richard Earnshaw (rearnsha@arm.com)
* arm.c (arm_return_in_memory): APCS rules state that the elements
of a structure returned in a register must be 'integer-like'.
1999-10-19 Bruce Korb <autogen@linuxbox.com>
* fixinc/Makefile.in: Change the generation rules to run `genfixes'

View file

@ -1404,12 +1404,12 @@ arm_return_in_memory (type)
{
tree field;
/* For a struct the APCS says that we must return in a register if
every addressable element has an offset of zero. For practical
purposes this means that the structure can have at most one non
bit-field element and that this element must be the first one in
the structure. */
/* For a struct the APCS says that we only return in a register
if the type is 'integer like' and every addressable element
has an offset of zero. For practical purposes this means
that the structure can have at most one non bit-field element
and that this element must be the first one in the structure. */
/* Find the first field, ignoring non FIELD_DECL things which will
have been created by C++. */
for (field = TYPE_FIELDS (type);
@ -1420,7 +1420,19 @@ arm_return_in_memory (type)
if (field == NULL)
return 0; /* An empty structure. Allowed by an extension to ANSI C. */
/* Now check the remaining fields, if any. */
/* Check that the first field is valid for returning in a register... */
/* ... Floats are not allowed */
if (FLOAT_TYPE_P (TREE_TYPE (field)))
return 1;
/* ... Aggregates that are not themselves valid for returning in
a register are not allowed. */
if (RETURN_IN_MEMORY (TREE_TYPE (field)))
return 1;
/* Now check the remaining fields, if any. Only bitfields are allowed,
since they are not addressable. */
for (field = TREE_CHAIN (field);
field;
field = TREE_CHAIN (field))