From f9f45ccb5ff5fe101f543b8e55a831df05bdaffb Mon Sep 17 00:00:00 2001 From: Jim Wilson Date: Tue, 1 Aug 2000 03:22:53 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/config/ia64/ia64.c | 10 ++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f2f83e88d60..7c9d309616f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2000-07-31 Jim Wilson + + * config/ia64/ia64.c (ia64_function_arg): Use alignment not size + when computing offset. + Mon Jul 31 20:35:50 2000 Denis Chertykov * genpeep.c (main): Handle DEFINE_PEEPHOLE2. diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index 7153620b183..7c015f47c27 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. */