From: David Edelsohn Date: Tue, 9 Dec 1997 16:35:56 +0000 (+0000) Subject: rs6000.h (FUNCTION_ARG_PADDING): Define. X-Git-Tag: releases/libf2c-0.5.22~406 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c229cba913547a5fe68d707333b10febc9f4ac2c;p=thirdparty%2Fgcc.git rs6000.h (FUNCTION_ARG_PADDING): Define. * rs6000.h (FUNCTION_ARG_PADDING): Define. * rs6000.c (function_arg_padding): New function. From-SVN: r17029 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ee3c615affa9..efdd2a8bb06b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Tue Dec 9 09:38:58 1997 David Edelsohn + + * rs6000.h (FUNCTION_ARG_PADDING): Define. + * rs6000.c (function_arg_padding): New function. + Tue Dec 9 10:34:21 1997 Manfred Hollstein * m68k.c: Include tree.h only once. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 2dbdb9235389..f8a10b6cf4fe 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -1167,6 +1167,35 @@ init_cumulative_args (cum, fntype, libname, incoming) } } +/* If defined, a C expression which determines whether, and in which + direction, to pad out an argument with extra space. The value + should be of type `enum direction': either `upward' to pad above + the argument, `downward' to pad below, or `none' to inhibit + padding. + + For the AIX ABI structs are always stored left shifted in their + argument slot. */ + +enum direction +function_arg_padding (mode, type) + enum machine_mode mode; + tree type; +{ + if (type && TREE_CODE (type) == RECORD_TYPE) + { + return upward; + } + + /* This is the default definition. */ + return (! BYTES_BIG_ENDIAN + ? upward + : ((mode == BLKmode + ? (type && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST + && int_size_in_bytes (type) < (PARM_BOUNDARY / BITS_PER_UNIT)) + : GET_MODE_BITSIZE (mode) < PARM_BOUNDARY) + ? downward : upward)); +} + /* If defined, a C expression that gives the alignment boundary, in bits, of an argument with the specified mode and type. If it is not defined, PARM_BOUNDARY is used for all arguments. diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index d30af75f155e..087ac5ad8ce7 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -1461,6 +1461,15 @@ typedef struct rs6000_args #define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) \ function_arg_pass_by_reference(&CUM, MODE, TYPE, NAMED) +/* If defined, a C expression which determines whether, and in which + direction, to pad out an argument with extra space. The value + should be of type `enum direction': either `upward' to pad above + the argument, `downward' to pad below, or `none' to inhibit + padding. */ + +#define FUNCTION_ARG_PADDING(MODE, TYPE) \ + function_arg_padding (MODE, TYPE) + /* If defined, a C expression that gives the alignment boundary, in bits, of an argument with the specified mode and type. If it is not defined, PARM_BOUNDARY is used for all arguments. */