From: David Edelsohn Date: Sat, 20 Dec 1997 15:11:26 +0000 (+0000) Subject: rs6000.h (FUNCTION_ARG_PADDING): Define. X-Git-Tag: prereleases/egcs-1.0.1-prerelease~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0ecab26a2381964c734196340d36354f83ad75f3;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: r17162 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 06911c39a868..7f55170485c0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Sat Dec 20 16:14:50 1997 David Edelsohn + + * rs6000.h (FUNCTION_ARG_PADDING): Define. + * rs6000.c (function_arg_padding): New function. + Sat Dec 20 13:36:06 1997 Paul Eggert Richard Kenner H.J. Lu (hjl@gnu.org) diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 6c50f6233c78..f5c47738c906 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 3e7b932ffb2f..b16a5300012f 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. */