aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJim Wilson <wilson@cygnus.com>2000-08-01 03:22:53 +0000
committerJim Wilson <wilson@gcc.gnu.org>2000-07-31 20:22:53 -0700
commitf9f45ccb5ff5fe101f543b8e55a831df05bdaffb (patch)
treee8d7b61abce7dc8d95f900dadc7062ccd1d48b23 /gcc
parent003661ddec1ac7ed08d8b6e21166fdadc37eb1d3 (diff)
downloadgcc-f9f45ccb5ff5fe101f543b8e55a831df05bdaffb.zip
gcc-f9f45ccb5ff5fe101f543b8e55a831df05bdaffb.tar.gz
gcc-f9f45ccb5ff5fe101f543b8e55a831df05bdaffb.tar.bz2
Adjust structure parameter passing to match ABI change.
* config/ia64/ia64.c (ia64_function_arg): Use alignment not size when computing offset. From-SVN: r35401
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/ia64/ia64.c10
2 files changed, 13 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f2f83e8..7c9d309 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2000-07-31 Jim Wilson <wilson@cygnus.com>
+
+ * config/ia64/ia64.c (ia64_function_arg): Use alignment not size
+ when computing offset.
+
Mon Jul 31 20:35:50 2000 Denis Chertykov <denisc@overta.ru>
* genpeep.c (main): Handle DEFINE_PEEPHOLE2.
diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c
index 7153620..7c015f4 100644
--- a/gcc/config/ia64/ia64.c
+++ b/gcc/config/ia64/ia64.c
@@ -1542,8 +1542,14 @@ ia64_function_arg (cum, mode, type, named, incoming)
int offset = 0;
enum machine_mode hfa_mode = VOIDmode;
- /* Arguments larger than 8 bytes start at the next even boundary. */
- if (words > 1 && (cum->words & 1))
+ /* Integer and float arguments larger than 8 bytes start at the next even
+ boundary. Aggregates larger than 8 bytes start at the next even boundary
+ if the aggregate has 16 byte alignment. */
+ /* ??? The ABI does not specify how to handle aggregates with alignment from
+ 9 to 15 bytes, or greater than 16. We handle them all as if they had
+ 16 byte alignment. Such aggregates can occur only if gcc extensions are
+ used. */
+ if ((TYPE_ALIGN (type) > 8 * BITS_PER_UNIT) && (cum->words & 1))
offset = 1;
/* If all argument slots are used, then it must go on the stack. */