/* Register Transfer Language (RTL) definitions for GNU C-Compiler
- Copyright (C) 1987, 91, 92, 93, 94, 1995 Free Software Foundation, Inc.
+ Copyright (C) 1987, 91-96, 1997 Free Software Foundation, Inc.
This file is part of GNU CC.
You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING. If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
#include "machmode.h"
/* The cast here, saves many elsewhere. */
extern int rtx_length[];
-#define GET_RTX_LENGTH(CODE) (rtx_length[(int)(CODE)])
+#define GET_RTX_LENGTH(CODE) (rtx_length[(int) (CODE)])
extern char *rtx_name[];
-#define GET_RTX_NAME(CODE) (rtx_name[(int)(CODE)])
+#define GET_RTX_NAME(CODE) (rtx_name[(int) (CODE)])
extern char *rtx_format[];
-#define GET_RTX_FORMAT(CODE) (rtx_format[(int)(CODE)])
+#define GET_RTX_FORMAT(CODE) (rtx_format[(int) (CODE)])
extern char rtx_class[];
-#define GET_RTX_CLASS(CODE) (rtx_class[(int)(CODE)])
+#define GET_RTX_CLASS(CODE) (rtx_class[(int) (CODE)])
\f
/* Common union for an element of an rtx. */
In a REG, nonzero means this reg refers to the return value
of the current function. */
unsigned integrated : 1;
+ /* Nonzero if this rtx is related to the call frame, either changing how
+ we compute the frame address or saving and restoring registers in
+ the prologue and epilogue. */
+ unsigned frame_related : 1;
/* The first element of the operands of this rtx.
The number of operands and their types are controlled
by the `code' field, according to rtl.def. */
rtunion fld[1];
} *rtx;
-
-/* Add prototype support. */
-#ifndef PROTO
-#if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__)
-#define PROTO(ARGS) ARGS
-#else
-#define PROTO(ARGS) ()
-#endif
-#endif
-
-#ifndef VPROTO
-#ifdef __STDC__
-#define PVPROTO(ARGS) ARGS
-#define VPROTO(ARGS) ARGS
-#define VA_START(va_list,var) va_start(va_list,var)
-#else
-#define PVPROTO(ARGS) ()
-#define VPROTO(ARGS) (va_alist) va_dcl
-#define VA_START(va_list,var) va_start(va_list)
-#endif
-#endif
-
-#ifndef STDIO_PROTO
-#ifdef BUFSIZ
-#define STDIO_PROTO(ARGS) PROTO(ARGS)
-#else
-#define STDIO_PROTO(ARGS) ()
-#endif
-#endif
+#include "gansidecl.h"
#define NULL_RTX (rtx) 0
-/* Define a generic NULL if one hasn't already been defined. */
-
-#ifndef NULL
-#define NULL 0
-#endif
-
-#ifndef GENERIC_PTR
-#if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__)
-#define GENERIC_PTR void *
-#else
-#define GENERIC_PTR char *
-#endif
-#endif
-
-#ifndef NULL_PTR
-#define NULL_PTR ((GENERIC_PTR)0)
-#endif
-
/* Define macros to access the `code' field of the rtx. */
#ifdef SHORT_ENUM_BUG
#define RTX_INTEGRATED_P(RTX) ((RTX)->integrated)
#define RTX_UNCHANGING_P(RTX) ((RTX)->unchanging)
+#define RTX_FRAME_RELATED_P(RTX) ((RTX)->frame_related)
/* RTL vector. These appear inside RTX's when there is a need
for a variable number of things. The principle use is inside
not needed past this insn). If REG is set in this insn, the REG_DEAD
note may, but need not, be omitted.
REG_INC means that the REG is autoincremented or autodecremented.
- REG_EQUIV describes the insn as a whole; it says that the
- insn sets a register to a constant value or to be equivalent to
- a memory address. If the
- register is spilled to the stack then the constant value
- should be substituted for it. The contents of the REG_EQUIV
+ REG_EQUIV describes the insn as a whole; it says that the insn
+ sets a register to a constant value or to be equivalent to a memory
+ address. If the register is spilled to the stack then the constant
+ value should be substituted for it. The contents of the REG_EQUIV
is the constant value or memory address, which may be different
- from the source of the SET although it has the same value.
+ from the source of the SET although it has the same value. A
+ REG_EQUIV note may also appear on an insn which copies a register
+ parameter to a pseudo-register, if there is a memory address which
+ could be used to hold that pseudo-register throughout the function.
REG_EQUAL is like REG_EQUIV except that the destination
is only momentarily equal to the specified rtx. Therefore, it
cannot be used for substitution; but it can be used for cse.
/* Names for REG_NOTE's in EXPR_LIST insn's. */
extern char *reg_note_name[];
-#define GET_REG_NOTE_NAME(MODE) (reg_note_name[(int)(MODE)])
+#define GET_REG_NOTE_NAME(MODE) (reg_note_name[(int) (MODE)])
/* This field is only present on CALL_INSNs. It holds a chain of EXPR_LIST of
USE and CLOBBER expressions.
i.e. the point just after all of the parms have been moved into
their homes, etc. */
#define NOTE_INSN_FUNCTION_BEG -13
+/* These note where exception handling regions begin and end. */
+#define NOTE_INSN_EH_REGION_BEG -14
+#define NOTE_INSN_EH_REGION_END -15
#if 0 /* These are not used, and I don't know what they were for. --rms. */
/* The rest is used instead of the above, in a CODE_LABEL,
if bytecode is being output.
- We make the slightly klugy assumption that a LABEL has enough slots
+ We make the slightly kludgy assumption that a LABEL has enough slots
to hold these things. That happens to be true. */
/* For static or external objects. */
for the function arguments.
ORIGINAL_DECL_INITIAL is a pointer to the original DECL_INITIAL for the
function.
+ INLINE_REGNO_REG_RTX, INLINE_REGNO_POINTER_FLAG, and
+ INLINE_REGNO_POINTER_ALIGN are pointers to the corresponding arrays.
We want this to lay down like an INSN. The PREV_INSN field
is always NULL. The NEXT_INSN field always points to the
#define OUTGOING_ARGS_SIZE(RTX) ((RTX)->fld[13].rtint)
#define ORIGINAL_ARG_VECTOR(RTX) ((RTX)->fld[14].rtvec)
#define ORIGINAL_DECL_INITIAL(RTX) ((RTX)->fld[15].rtx)
+#define INLINE_REGNO_REG_RTX(RTX) ((RTX)->fld[16].rtvec)
+#define INLINE_REGNO_POINTER_FLAG(RTX) ((RTX)->fld[17].rtstr)
+#define INLINE_REGNO_POINTER_ALIGN(RTX) ((RTX)->fld[18].rtstr)
/* In FUNCTION_FLAGS we save some variables computed when emitting the code
for the function and which must be `or'ed into the current flag values when
extern rtx copy_most_rtx PROTO((rtx, rtx));
extern rtx replace_rtx PROTO((rtx, rtx, rtx));
extern rtvec gen_rtvec_v PROTO((int, rtx *));
+extern rtvec gen_rtvec_vv PROTO((int, rtunion *));
extern rtx gen_reg_rtx PROTO((enum machine_mode));
extern rtx gen_label_rtx PROTO((void));
extern rtx gen_inline_header_rtx PROTO((rtx, rtx, int, int, int, int,
int, int, rtx, rtx, int, int,
- rtvec, rtx));
+ rtvec, rtx,
+ rtvec, char *, char *));
extern rtx gen_lowpart_common PROTO((enum machine_mode, rtx));
extern rtx gen_lowpart PROTO((enum machine_mode, rtx));
extern rtx gen_lowpart_if_possible PROTO((enum machine_mode, rtx));
extern rtx simplify_subtraction PROTO((rtx));
extern rtx assign_stack_local PROTO((enum machine_mode, int, int));
extern rtx assign_stack_temp PROTO((enum machine_mode, int, int));
+extern rtx assign_temp PROTO((union tree_node *, int,
+ int, int));
extern rtx protect_from_queue PROTO((rtx, int));
extern void emit_queue PROTO((void));
extern rtx emit_move_insn PROTO((rtx, rtx));
Allocated in parallel with regno_pointer_flag. */
extern rtx *regno_reg_rtx;
+/* Vector indexed by regno; contains the alignment in bytes for a
+ register that contains a pointer, if known. */
+extern char *regno_pointer_align;
+#define REGNO_POINTER_ALIGN(REGNO) regno_pointer_align[REGNO]
+
/* Translates rtx code to tree code, for those codes needed by
REAL_ARITHMETIC. The function returns an int because the caller may not
know what `enum tree_code' means. */