diff options
Diffstat (limited to 'gcc/rtl.h')
-rw-r--r-- | gcc/rtl.h | 93 |
1 files changed, 80 insertions, 13 deletions
diff --git a/gcc/rtl.h b/gcc/rtl.h index d493956dcf0..eb9931c8365 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -62,6 +62,8 @@ extern const char * const rtx_format[NUM_RTX_CODE]; extern const char rtx_class[NUM_RTX_CODE]; #define GET_RTX_CLASS(CODE) (rtx_class[(int) (CODE)]) + +extern const unsigned char rtx_next[NUM_RTX_CODE]; /* The flags and bitfields of an ADDR_DIFF_VEC. BASE is the base label relative to which the offsets are calculated, as explained in rtl.def. */ @@ -103,7 +105,7 @@ typedef struct mem_attrs GTY(()) /* Common union for an element of an rtx. */ -typedef union rtunion_def +union rtunion_def { HOST_WIDE_INT rtwint; int rtint; @@ -118,11 +120,13 @@ typedef union rtunion_def tree rttree; struct basic_block_def *bb; mem_attrs *rtmem; -} rtunion; +}; +typedef union rtunion_def rtunion; /* RTL expression ("rtx"). */ -struct rtx_def +struct rtx_def GTY((chain_next ("RTX_NEXT (&%h)"), + chain_prev ("RTX_PREV (&%h)"))) { /* The kind of expression this is. */ ENUM_BITFIELD(rtx_code) code: 16; @@ -198,11 +202,29 @@ struct rtx_def /* 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]; + rtunion GTY ((special ("rtx_def"), + desc ("GET_CODE (&%0)"))) fld[1]; }; #define NULL_RTX (rtx) 0 +/* The "next" and "previous" RTX, relative to this one. */ + +#define RTX_NEXT(X) (rtx_next[GET_CODE (X)] == 0 ? NULL \ + : *(rtx *)(((char *)X) + rtx_next[GET_CODE (X)])) + +/* FIXME: the "NEXT_INSN (PREV_INSN (X)) == X" condition shouldn't be needed. + */ +#define RTX_PREV(X) ((GET_CODE (X) == INSN \ + || GET_CODE (X) == CALL_INSN \ + || GET_CODE (X) == JUMP_INSN \ + || GET_CODE (X) == NOTE \ + || GET_CODE (X) == BARRIER \ + || GET_CODE (X) == CODE_LABEL) \ + && PREV_INSN (X) != NULL \ + && NEXT_INSN (PREV_INSN (X)) == X \ + ? PREV_INSN (X) : NULL) + /* Define macros to access the `code' field of the rtx. */ #define GET_CODE(RTX) ((enum rtx_code) (RTX)->code) @@ -765,6 +787,7 @@ extern const char * const reg_note_name[]; #define NOTE_BASIC_BLOCK(INSN) XCBBDEF (INSN, 4, NOTE) #define NOTE_EXPECTED_VALUE(INSN) XCEXP (INSN, 4, NOTE) #define NOTE_PREDICTION(INSN) XCINT (INSN, 4, NOTE) +#define NOTE_PRECONDITIONED(INSN) XCINT (INSN, 4, NOTE) /* In a NOTE that is a line number, this is the line number. Other kinds of NOTEs are identified by negative numbers here. */ @@ -860,7 +883,7 @@ enum insn_note NOTE_EXPECTED_VALUE; stored as (eq (reg) (const_int)). */ NOTE_INSN_EXPECTED_VALUE, - /* Record a prediction. Uses NOTE_PREDICTION. */ + /* Record a prediction. Uses NOTE_PREDICTION. */ NOTE_INSN_PREDICTION, NOTE_INSN_MAX @@ -988,14 +1011,13 @@ enum label_kind #define INTVAL(RTX) XCWINT(RTX, 0, CONST_INT) /* For a CONST_DOUBLE: - The usual two ints that hold the value. - For a DImode, that is all there are; - and CONST_DOUBLE_LOW is the low-order word and ..._HIGH the high-order. - For a float, the number of ints varies, - and CONST_DOUBLE_LOW is the one that should come first *in memory*. - So use &CONST_DOUBLE_LOW(r) as the address of an array of ints. */ + For a DImode, there are two integers CONST_DOUBLE_LOW is the + low-order word and ..._HIGH the high-order. + For a float, there is a REAL_VALUE_TYPE structure, and + CONST_DOUBLE_REAL_VALUE(r) is a pointer to it. */ #define CONST_DOUBLE_LOW(r) XCWINT (r, 0, CONST_DOUBLE) #define CONST_DOUBLE_HIGH(r) XCWINT (r, 1, CONST_DOUBLE) +#define CONST_DOUBLE_REAL_VALUE(r) ((struct real_value *)&CONST_DOUBLE_LOW(r)) /* For a CONST_VECTOR, return element #n. */ #define CONST_VECTOR_ELT(RTX, N) XCVECEXP (RTX, 0, N, CONST_VECTOR) @@ -1082,7 +1104,7 @@ do { \ #define MEM_SCALAR_P(RTX) \ (RTL_FLAG_CHECK1("MEM_SCALAR_P", (RTX), MEM)->frame_related) -/* If VAL is non-zero, set MEM_IN_STRUCT_P and clear MEM_SCALAR_P in +/* If VAL is nonzero, set MEM_IN_STRUCT_P and clear MEM_SCALAR_P in RTX. Otherwise, vice versa. Use this macro only when you are *sure* that you know that the MEM is in a structure, or is a scalar. VAL is evaluated only once. */ @@ -1555,6 +1577,7 @@ extern rtx set_unique_reg_note PARAMS ((rtx, enum reg_note, rtx)); #define single_set_1(I) single_set_2 (I, PATTERN (I)) extern int rtx_addr_can_trap_p PARAMS ((rtx)); +extern bool nonzero_address_p PARAMS ((rtx)); extern int rtx_unstable_p PARAMS ((rtx)); extern int rtx_varies_p PARAMS ((rtx, int)); extern int rtx_addr_varies_p PARAMS ((rtx, int)); @@ -1922,6 +1945,7 @@ extern int invert_jump_1 PARAMS ((rtx, rtx)); extern int invert_jump PARAMS ((rtx, rtx, int)); extern int rtx_renumbered_equal_p PARAMS ((rtx, rtx)); extern int true_regnum PARAMS ((rtx)); +extern unsigned int reg_or_subregno PARAMS ((rtx)); extern int redirect_jump_1 PARAMS ((rtx, rtx)); extern int redirect_jump PARAMS ((rtx, rtx, int)); extern void rebuild_jump_labels PARAMS ((rtx)); @@ -2069,6 +2093,7 @@ extern int global_alloc PARAMS ((FILE *)); extern void dump_global_regs PARAMS ((FILE *)); #endif #ifdef HARD_CONST +/* Yes, this ifdef is silly, but HARD_REG_SET is not always defined. */ extern void retry_global_alloc PARAMS ((int, HARD_REG_SET)); #endif extern void build_insn_chain PARAMS ((rtx)); @@ -2086,6 +2111,14 @@ extern void regclass PARAMS ((rtx, int, FILE *)); extern void reg_scan PARAMS ((rtx, unsigned int, int)); extern void reg_scan_update PARAMS ((rtx, rtx, unsigned int)); extern void fix_register PARAMS ((const char *, int, int)); +#ifdef HARD_CONST +extern void cannot_change_mode_set_regs PARAMS ((HARD_REG_SET *, + enum machine_mode, + unsigned int)); +#endif +extern bool invalid_mode_change_p PARAMS ((unsigned int, + enum reg_class, + enum machine_mode)); extern int delete_null_pointer_checks PARAMS ((rtx)); @@ -2111,7 +2144,7 @@ extern int function_invariant_p PARAMS ((rtx)); extern void init_branch_prob PARAMS ((const char *)); extern void branch_prob PARAMS ((void)); extern void end_branch_prob PARAMS ((void)); -extern void output_func_start_profiler PARAMS ((void)); +extern void create_profiler PARAMS ((void)); /* In reg-stack.c */ #ifdef BUFSIZ @@ -2246,4 +2279,38 @@ extern void invert_br_probabilities PARAMS ((rtx)); extern bool expensive_function_p PARAMS ((int)); /* In tracer.c */ extern void tracer PARAMS ((void)); + +/* In calls.c */ + +/* Nonzero if this is a call to a `const' function. */ +#define ECF_CONST 1 +/* Nonzero if this is a call to a `volatile' function. */ +#define ECF_NORETURN 2 +/* Nonzero if this is a call to malloc or a related function. */ +#define ECF_MALLOC 4 +/* Nonzero if it is plausible that this is a call to alloca. */ +#define ECF_MAY_BE_ALLOCA 8 +/* Nonzero if this is a call to a function that won't throw an exception. */ +#define ECF_NOTHROW 16 +/* Nonzero if this is a call to setjmp or a related function. */ +#define ECF_RETURNS_TWICE 32 +/* Nonzero if this is a call to `longjmp'. */ +#define ECF_LONGJMP 64 +/* Nonzero if this is a syscall that makes a new process in the image of + the current one. */ +#define ECF_FORK_OR_EXEC 128 +#define ECF_SIBCALL 256 +/* Nonzero if this is a call to "pure" function (like const function, + but may read memory. */ +#define ECF_PURE 512 +/* Nonzero if this is a call to a function that returns with the stack + pointer depressed. */ +#define ECF_SP_DEPRESSED 1024 +/* Nonzero if this call is known to always return. */ +#define ECF_ALWAYS_RETURN 2048 +/* Create libcall block around the call. */ +#define ECF_LIBCALL_BLOCK 4096 + +extern int flags_from_decl_or_type PARAMS ((tree)); + #endif /* ! GCC_RTL_H */ |