Commit 3a2ea258 by Richard Earnshaw Committed by Nick Clifton

Fix APCS violation.

From-SVN: r30087
parent db025289
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> 1999-10-19 Bruce Korb <autogen@linuxbox.com>
* fixinc/Makefile.in: Change the generation rules to run `genfixes' * fixinc/Makefile.in: Change the generation rules to run `genfixes'
......
...@@ -1404,11 +1404,11 @@ arm_return_in_memory (type) ...@@ -1404,11 +1404,11 @@ arm_return_in_memory (type)
{ {
tree field; tree field;
/* For a struct the APCS says that we must return in a register if /* For a struct the APCS says that we only return in a register
every addressable element has an offset of zero. For practical if the type is 'integer like' and every addressable element
purposes this means that the structure can have at most one non has an offset of zero. For practical purposes this means
bit-field element and that this element must be the first one in that the structure can have at most one non bit-field element
the structure. */ and that this element must be the first one in the structure. */
/* Find the first field, ignoring non FIELD_DECL things which will /* Find the first field, ignoring non FIELD_DECL things which will
have been created by C++. */ have been created by C++. */
...@@ -1420,7 +1420,19 @@ arm_return_in_memory (type) ...@@ -1420,7 +1420,19 @@ arm_return_in_memory (type)
if (field == NULL) if (field == NULL)
return 0; /* An empty structure. Allowed by an extension to ANSI C. */ 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); for (field = TREE_CHAIN (field);
field; field;
field = TREE_CHAIN (field)) field = TREE_CHAIN (field))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment