This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch] hppa: Hookize some target macros.
- From: Kazu Hirata <kazu at cs dot umass dot edu>
- To: gcc-patches at gcc dot gnu dot org
- Cc: law at redhat dot com, dave dot anglin at nrc dot ca
- Date: Sun, 25 Jan 2004 13:54:49 -0500 (EST)
- Subject: [patch] hppa: Hookize some target macros.
Hi,
Attached is a patch to hookize some target macros.
Since I am planning to poison STRUCT_VALUE_REGNUM once I complete the
migration, I renamed STRUCT_VALUE_REGNUM to PA_STRUCT_VALUE_REGNUM.
Built cc1 of hppa-unknown-linux. OK to apply?
Kazu Hirata
2004-01-25 Kazu Hirata <kazu@cs.umass.edu>
* config/pa/pa-protos.h: Remove the prototype for
hppa_builtin_saveregs. Add a prototype for
pa_return_in_memory.
* config/pa/pa.c (TARGET_PROMOTE_FUNCTION_RETURN): New.
(TARGET_PROMOTE_PROTOTYPES): Likewise.
(TARGET_STRUCT_VALUE_RTX): Likewise.
(TARGET_RETURN_IN_MEMORY): Likewise.
(TARGET_EXPAND_BUILTIN_SAVEREGS): Likewise.
(pa_struct_value_rtx): Likewise.
(pa_return_in_memory): Likewise.
* config/pa/pa.h (STRUCT_VALUE_REGNUM): Rename to
PA_STRUCT_VALUE_REGNUM.
(INIT_CUMULATIVE_ARGS): Use pa_return_in_memory.
(EXPAND_BUILTIN_SAVEREGS): Remove.
(PROMOTE_PROTOTYPES): Likewise.
(PROMOTE_FUNCTION_RETURN): Likewise.
Index: pa-protos.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/pa/pa-protos.h,v
retrieving revision 1.31
diff -u -r1.31 pa-protos.h
--- pa-protos.h 21 Jan 2004 21:52:31 -0000 1.31
+++ pa-protos.h 25 Jan 2004 18:46:30 -0000
@@ -133,8 +133,6 @@
/* Prototype function used in macro CONST_OK_FOR_LETTER_P. */
extern int zdepi_cint_p (unsigned HOST_WIDE_INT);
-extern struct rtx_def *hppa_builtin_saveregs (void);
-
extern void override_options (void);
extern void output_ascii (FILE *, const char *, int);
extern HOST_WIDE_INT compute_frame_size (HOST_WIDE_INT, int *);
@@ -164,4 +162,5 @@
extern int function_arg_partial_nregs (CUMULATIVE_ARGS *,
enum machine_mode,
tree, int);
+extern bool pa_return_in_memory (tree, tree);
#endif /* TREE_CODE */
Index: pa.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/pa/pa.c,v
retrieving revision 1.237
diff -u -r1.237 pa.c
--- pa.c 20 Jan 2004 22:20:05 -0000 1.237
+++ pa.c 25 Jan 2004 18:46:34 -0000
@@ -131,6 +131,7 @@
static void pa_asm_out_destructor (rtx, int);
#endif
static void pa_init_builtins (void);
+static rtx hppa_builtin_saveregs (void);
static void copy_fp_args (rtx) ATTRIBUTE_UNUSED;
static int length_fp_args (rtx) ATTRIBUTE_UNUSED;
static struct deferred_plabel *get_plabel (const char *)
@@ -148,6 +149,7 @@
#ifdef HPUX_LONG_DOUBLE_LIBRARY
static void pa_hpux_init_libfuncs (void);
#endif
+static rtx pa_struct_value_rtx (tree, int);
/* Save the operands last given to a compare for use when we
generate a scc or bcc insn. */
@@ -261,6 +263,19 @@
#define TARGET_INIT_LIBFUNCS pa_hpux_init_libfuncs
#endif
+#undef TARGET_PROMOTE_FUNCTION_RETURN
+#define TARGET_PROMOTE_FUNCTION_RETURN hook_bool_tree_true
+#undef TARGET_PROMOTE_PROTOTYPES
+#define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_true
+
+#undef TARGET_STRUCT_VALUE_RTX
+#define TARGET_STRUCT_VALUE_RTX pa_struct_value_rtx
+#undef TARGET_RETURN_IN_MEMORY
+#define TARGET_RETURN_IN_MEMORY pa_return_in_memory
+
+#undef TARGET_EXPAND_BUILTIN_SAVEREGS
+#define TARGET_EXPAND_BUILTIN_SAVEREGS hppa_builtin_saveregs
+
struct gcc_target targetm = TARGET_INITIALIZER;
void
@@ -5836,7 +5851,7 @@
to determine if stdargs or varargs is used and fill in an initial
va_list. A pointer to this constructor is returned. */
-struct rtx_def *
+static rtx
hppa_builtin_saveregs (void)
{
rtx offset, dest;
@@ -8748,7 +8763,7 @@
the mode is SF or DF. Then the value is returned in fr4 (32).
This must perform the same promotions as PROMOTE_MODE, else
- PROMOTE_FUNCTION_RETURN will not work correctly.
+ TARGET_PROMOTE_FUNCTION_RETURN will not work correctly.
Small structures must be returned in a PARALLEL on PA64 in order
to match the HP Compiler ABI. */
@@ -9077,4 +9092,27 @@
fputs (",DATA\n", stream);
}
}
+
+static rtx
+pa_struct_value_rtx (tree fntype ATTRIBUTE_UNUSED,
+ int incoming ATTRIBUTE_UNUSED)
+{
+ return gen_rtx_REG (Pmode, PA_STRUCT_VALUE_REGNUM);
+}
+
+bool
+pa_return_in_memory (tree type, tree fntype ATTRIBUTE_UNUSED)
+{
+ /* SOM ABI says that objects larger than 64 bits are returned in memory.
+ PA64 ABI says that objects larger than 128 bits are returned in memory.
+ Note, int_size_in_bytes can return -1 if the size of the object is
+ variable or larger than the maximum value that can be expressed as
+ a HOST_WIDE_INT. It can also return zero for an empty type. The
+ simplest way to handle variable and empty types is to pass them in
+ memory. This avoids problems in defining the boundaries of argument
+ slots, allocating registers, etc. */
+ return (int_size_in_bytes (type) > (TARGET_64BIT ? 16 : 8)
+ || int_size_in_bytes (type) <= 0);
+}
+
#include "gt-pa.h"
Index: pa.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/pa/pa.h,v
retrieving revision 1.210
diff -u -r1.210 pa.h
--- pa.h 21 Jan 2004 21:52:31 -0000 1.210
+++ pa.h 25 Jan 2004 18:46:36 -0000
@@ -554,21 +554,9 @@
#define DEFAULT_PCC_STRUCT_RETURN 0
-/* SOM ABI says that objects larger than 64 bits are returned in memory.
- PA64 ABI says that objects larger than 128 bits are returned in memory.
- Note, int_size_in_bytes can return -1 if the size of the object is
- variable or larger than the maximum value that can be expressed as
- a HOST_WIDE_INT. It can also return zero for an empty type. The
- simplest way to handle variable and empty types is to pass them in
- memory. This avoids problems in defining the boundaries of argument
- slots, allocating registers, etc. */
-#define RETURN_IN_MEMORY(TYPE) \
- (int_size_in_bytes (TYPE) > (TARGET_64BIT ? 16 : 8) \
- || int_size_in_bytes (TYPE) <= 0)
-
/* Register in which address to store a structure value
is passed to a function. */
-#define STRUCT_VALUE_REGNUM 28
+#define PA_STRUCT_VALUE_REGNUM 28
/* Describe how we implement __builtin_eh_return. */
#define EH_RETURN_DATA_REGNO(N) \
@@ -804,7 +792,7 @@
(CUM).nargs_prototype = (FNTYPE && TYPE_ARG_TYPES (FNTYPE) \
? (list_length (TYPE_ARG_TYPES (FNTYPE)) - 1 \
+ (TYPE_MODE (TREE_TYPE (FNTYPE)) == BLKmode \
- || RETURN_IN_MEMORY (TREE_TYPE (FNTYPE)))) \
+ || pa_return_in_memory (TREE_TYPE (FNTYPE), 0))) \
: 0)
@@ -1153,13 +1141,6 @@
#define TRAMPOLINE_ADJUST_ADDRESS(ADDR) \
if (!TARGET_64BIT) (ADDR) = memory_address (Pmode, plus_constant ((ADDR), 46))
-/* Emit code for a call to builtin_saveregs. We must emit USE insns which
- reference the 4 integer arg registers and 4 fp arg registers.
- Ordinarily they are not call used registers, but they are for
- _builtin_saveregs, so we must make this explicit. */
-
-#define EXPAND_BUILTIN_SAVEREGS() hppa_builtin_saveregs ()
-
/* Implement `va_start' for varargs and stdarg. */
#define EXPAND_BUILTIN_VA_START(valist, nextarg) \
@@ -1733,10 +1714,6 @@
/* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
is done just by pretending it is already truncated. */
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
-
-/* When a prototype says `char' or `short', really pass an `int'. */
-#define PROMOTE_PROTOTYPES 1
-#define PROMOTE_FUNCTION_RETURN 1
/* Specify the machine mode that pointers have.
After generation of rtl, the compiler makes no further distinction