diff options
Diffstat (limited to 'gcc/config/rs6000')
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 27 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.h | 9 | ||||
-rw-r--r-- | gcc/config/rs6000/sysv4.h | 8 | ||||
-rw-r--r-- | gcc/config/rs6000/x-rs6000 | 1 |
4 files changed, 40 insertions, 5 deletions
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 2dbdb923538..34964a50fba 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -1167,6 +1167,33 @@ 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 != 0 && AGGREGATE_TYPE_P (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 d30af75f155..087ac5ad8ce 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. */ diff --git a/gcc/config/rs6000/sysv4.h b/gcc/config/rs6000/sysv4.h index e9a88a2d15a..1fdd2f032d8 100644 --- a/gcc/config/rs6000/sysv4.h +++ b/gcc/config/rs6000/sysv4.h @@ -1035,8 +1035,8 @@ do { \ %{!static: %(link_path) %{!R*:%{L*:-R %*}}} \ %{mshlib: } \ %{static:-dn -Bstatic} \ -%{shared:-G -dy -z text %{!h*:%{o*:-h %*}}} \ -%{symbolic:-Bsymbolic -G -dy -z text %{!h*:%{o*:-h %*}}}" +%{shared:-G -dy -z text} \ +%{symbolic:-Bsymbolic -G -dy -z text}" #else /* Shared libraries are not default. */ @@ -1044,8 +1044,8 @@ do { \ %{mshlib: %(link_path) } \ %{!mshlib: %{!shared: %{!symbolic: -dn -Bstatic}}} \ %{static: } \ -%{shared:-G -dy -z text %{!h*:%{o*:-h %*}} %(link_path) } \ -%{symbolic:-Bsymbolic -G -dy -z text %{!h*:%{o*:-h %*}} %(link_path) }" +%{shared:-G -dy -z text %(link_path) } \ +%{symbolic:-Bsymbolic -G -dy -z text %(link_path) }" #endif /* Override the default target of the linker. */ diff --git a/gcc/config/rs6000/x-rs6000 b/gcc/config/rs6000/x-rs6000 index ecfc0899079..0d8f3113fb5 100644 --- a/gcc/config/rs6000/x-rs6000 +++ b/gcc/config/rs6000/x-rs6000 @@ -1,5 +1,4 @@ # configuration for IBM rs6000 running aix -INSTALL=/usr/ucb/install -c # Show we need to use the C version of ALLOCA ALLOCA=alloca.o |