summaryrefslogtreecommitdiff
path: root/gcc/tree.h
diff options
context:
space:
mode:
authordnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4>2004-05-13 06:41:07 +0000
committerdnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4>2004-05-13 06:41:07 +0000
commit4ee9c6840ad3fc92a9034343278a1e476ad6872a (patch)
treea2568888a519c077427b133de9ece5879a8484a5 /gcc/tree.h
parentebb338380ab170c91e64d38038e6b5ce930d69a1 (diff)
downloadgcc-4ee9c6840ad3fc92a9034343278a1e476ad6872a.tar.gz
Merge tree-ssa-20020619-branch into mainline.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@81764 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree.h')
-rw-r--r--gcc/tree.h672
1 files changed, 607 insertions, 65 deletions
diff --git a/gcc/tree.h b/gcc/tree.h
index 0f7e7eda5f4..efc8691a0d0 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -148,11 +148,13 @@ extern GTY(()) tree implicit_built_in_decls[(int) END_BUILTINS];
See the accessor macros, defined below, for documentation of the
fields. */
+union tree_ann_d;
struct tree_common GTY(())
{
tree chain;
tree type;
+ union tree_ann_d *ann;
ENUM_BITFIELD(tree_code) code : 8;
@@ -163,17 +165,16 @@ struct tree_common GTY(())
unsigned readonly_flag : 1;
unsigned unsigned_flag : 1;
unsigned asm_written_flag: 1;
- unsigned used_flag : 1;
+ unsigned nowarning_flag : 1;
+ unsigned used_flag : 1;
unsigned nothrow_flag : 1;
unsigned static_flag : 1;
unsigned public_flag : 1;
unsigned private_flag : 1;
unsigned protected_flag : 1;
unsigned deprecated_flag : 1;
-
- unsigned unused_0 : 1;
- unsigned unused_1 : 1;
+ unsigned invariant_flag : 1;
unsigned lang_flag_0 : 1;
unsigned lang_flag_1 : 1;
@@ -182,7 +183,7 @@ struct tree_common GTY(())
unsigned lang_flag_4 : 1;
unsigned lang_flag_5 : 1;
unsigned lang_flag_6 : 1;
- unsigned unused_2 : 1;
+ unsigned visited : 1;
};
/* The following table lists the uses of each of the above flags and
@@ -196,14 +197,12 @@ struct tree_common GTY(())
..._TYPE, IDENTIFIER_NODE.
In a STMT_EXPR, it means we want the result of the enclosed
expression.
+ CALL_EXPR_TAILCALL in CALL_EXPR
static_flag:
TREE_STATIC in
VAR_DECL, FUNCTION_DECL, CONSTRUCTOR, ADDR_EXPR
- TREE_NO_UNUSED_WARNING in
- CONVERT_EXPR, NOP_EXPR, COMPOUND_EXPR, NON_LVALUE_EXPR
- ??? plus other expressions, apparently (e.g. MODIFY_EXPR).
TREE_VIA_VIRTUAL in
TREE_LIST or TREE_VEC
TREE_CONSTANT_OVERFLOW in
@@ -213,6 +212,9 @@ struct tree_common GTY(())
CLEANUP_EH_ONLY in
TARGET_EXPR, WITH_CLEANUP_EXPR, CLEANUP_STMT,
TREE_LIST elements of a block's cleanup list.
+ ASM_INPUT_P in
+ ASM_EXPR
+ EH_FILTER_MUST_NOT_THROW in EH_FILTER_EXPR
TYPE_REF_CAN_ALIAS_ALL in
POINTER_TYPE, REFERENCE_TYPE
@@ -223,8 +225,10 @@ struct tree_common GTY(())
??? and other expressions?
TREE_PUBLIC in
VAR_DECL or FUNCTION_DECL or IDENTIFIER_NODE
- EXPR_WFL_EMIT_LINE_NOTE in
- EXPR_WITH_FILE_LOCATION
+ TREE_VIA_PUBLIC in
+ TREE_LIST or TREE_VEC
+ ASM_VOLATILE_P in
+ ASM_EXPR
private_flag:
@@ -248,6 +252,9 @@ struct tree_common GTY(())
all decls
all constants
+ FORCED_LABEL in
+ LABEL_DECL
+
volatile_flag:
TREE_THIS_VOLATILE in
@@ -284,7 +291,7 @@ struct tree_common GTY(())
TREE_ASM_WRITTEN in
VAR_DECL, FUNCTION_DECL, RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE
- BLOCK
+ BLOCK, SSA_NAME
used_flag:
@@ -304,6 +311,19 @@ struct tree_common GTY(())
TREE_DEPRECATED in
..._DECL
+ visited:
+
+ Used in tree traversals to mark visited nodes.
+
+ invariant_flag:
+
+ TREE_INVARIANT in
+ all expressions.
+
+ nowarning_flag:
+
+ TREE_NO_WARNING in
+ ... any expr node
*/
/* Define accessors for the fields that all tree nodes have
@@ -387,6 +407,16 @@ struct tree_common GTY(())
__FUNCTION__); \
__t; })
+#define EREF_NODE_CHECK(t) __extension__ \
+({ const tree __t = t; \
+ if (TREE_CODE (__t) != EPHI_NODE \
+ && TREE_CODE (__t) != EKILL_NODE \
+ && TREE_CODE (__t) != EUSE_NODE \
+ && TREE_CODE (__t) != EEXIT_NODE) \
+ tree_check_failed (__t, TREE_CODE (t), \
+ __FILE__, __LINE__, __FUNCTION__); \
+ __t; })
+
#define TREE_VEC_ELT_CHECK(T, I) __extension__ \
(*({const tree __t = (T); \
const int __i = (I); \
@@ -398,6 +428,28 @@ struct tree_common GTY(())
__FILE__, __LINE__, __FUNCTION__); \
&__t->vec.a[__i]; }))
+#define EPHI_NODE_ELT_CHECK(t, i) __extension__ \
+(*({const tree __t = t; \
+ const int __i = (i); \
+ if (TREE_CODE (__t) != EPHI_NODE) \
+ tree_check_failed (__t, EPHI_NODE, \
+ __FILE__, __LINE__, __FUNCTION__); \
+ if (__i < 0 || __i >= __t->ephi.capacity) \
+ ephi_node_elt_check_failed (__i, __t->ephi.num_args, \
+ __FILE__, __LINE__, __FUNCTION__); \
+ &__t->ephi.a[__i]; }))
+
+#define PHI_NODE_ELT_CHECK(t, i) __extension__ \
+(*({const tree __t = t; \
+ const int __i = (i); \
+ if (TREE_CODE (__t) != PHI_NODE) \
+ tree_check_failed (__t, PHI_NODE, \
+ __FILE__, __LINE__, __FUNCTION__); \
+ if (__i < 0 || __i >= __t->phi.capacity) \
+ phi_node_elt_check_failed (__i, __t->phi.num_args, \
+ __FILE__, __LINE__, __FUNCTION__); \
+ &__t->phi.a[__i]; }))
+
/* Special checks for TREE_OPERANDs. */
#define TREE_OPERAND_CHECK(T, I) __extension__ \
(*({const tree __t = EXPR_CHECK (T); \
@@ -452,6 +504,12 @@ extern void tree_class_check_failed (const tree, int,
extern void tree_vec_elt_check_failed (int, int, const char *,
int, const char *)
ATTRIBUTE_NORETURN;
+extern void phi_node_elt_check_failed (int, int, const char *,
+ int, const char *)
+ ATTRIBUTE_NORETURN;
+extern void ephi_node_elt_check_failed (int, int, const char *,
+ int, const char *)
+ ATTRIBUTE_NORETURN;
extern void tree_operand_check_failed (int, enum tree_code,
const char *, int, const char *)
@@ -471,9 +529,14 @@ extern void tree_operand_check_failed (int, enum tree_code,
#define TREE_OPERAND_CHECK(T, I) ((T)->exp.operands[I])
#define TREE_OPERAND_CHECK_CODE(T, CODE, I) ((T)->exp.operands[I])
#define TREE_RTL_OPERAND_CHECK(T, CODE, I) (*(rtx *) &((T)->exp.operands[I]))
+#define EREF_NODE_CHECK(T) (T)
+#define PHI_NODE_ELT_CHECK(T, i) ((T)->phi.a[i])
+#define EPHI_NODE_ELT_CHECK(T, i) ((T)->ephi.a[i])
#endif
+#define TREE_BLOCK(NODE) ((NODE)->exp.block)
+
#include "tree-check.h"
#define TYPE_CHECK(T) TREE_CLASS_CHECK (T, 't')
@@ -565,6 +628,13 @@ extern void tree_operand_check_failed (int, enum tree_code,
== TREE_TYPE (TREE_OPERAND (EXP, 0)))) \
(EXP) = TREE_OPERAND (EXP, 0)
+/* Remove unnecessary type conversions according to
+ tree_ssa_useless_type_conversion. */
+
+#define STRIP_USELESS_TYPE_CONVERSION(EXP) \
+ while (tree_ssa_useless_type_conversion (EXP)) \
+ EXP = TREE_OPERAND (EXP, 0)
+
/* Nonzero if TYPE represents an integral type. Note that we do not
include COMPLEX types here. */
@@ -638,6 +708,8 @@ extern void tree_operand_check_failed (int, enum tree_code,
had its address taken. That matters for inline functions. */
#define TREE_ADDRESSABLE(NODE) ((NODE)->common.addressable_flag)
+#define CALL_EXPR_TAILCALL(NODE) (CALL_EXPR_CHECK(NODE)->common.addressable_flag)
+
/* In a VAR_DECL, nonzero means allocate static storage.
In a FUNCTION_DECL, nonzero if function has been defined.
In a CONSTRUCTOR, nonzero means allocate static storage.
@@ -651,13 +723,9 @@ extern void tree_operand_check_failed (int, enum tree_code,
executed if an exception is thrown, not on normal exit of its scope. */
#define CLEANUP_EH_ONLY(NODE) ((NODE)->common.static_flag)
-/* In a CONVERT_EXPR, NOP_EXPR, NON_LVALUE_EXPR or COMPOUND_EXPR, this means
- the node was made implicitly and should not lead to an "unused value"
- warning.
-
- ??? Apparently this is also used on other expression types (such as
- MODIFY_EXPR. This needs to be cleaned up sometime. */
-#define TREE_NO_UNUSED_WARNING(NODE) (EXPR_CHECK (NODE)->common.static_flag)
+/* In an expr node (usually a conversion) this means the node was made
+ implicitly and should not lead to any sort of warning. */
+#define TREE_NO_WARNING(NODE) ((NODE)->common.nowarning_flag)
/* Nonzero for a TREE_LIST or TREE_VEC node means that the derivation
chain is via a `virtual' declaration. */
@@ -704,6 +772,11 @@ extern void tree_operand_check_failed (int, enum tree_code,
#define TREE_SIDE_EFFECTS(NODE) \
(NON_TYPE_CHECK (NODE)->common.side_effects_flag)
+/* In a LABEL_DECL, nonzero means this label had its address taken
+ and therefore can never be deleted and is a jump target for
+ computed gotos. */
+#define FORCED_LABEL(NODE) ((NODE)->common.side_effects_flag)
+
/* Nonzero means this expression is volatile in the C sense:
its address should be of type `volatile WHATEVER *'.
In other words, the declared item is volatile qualified.
@@ -746,7 +819,9 @@ extern void tree_operand_check_failed (int, enum tree_code,
to be compiled separately.
Nonzero in a RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE or ENUMERAL_TYPE
if the sdb debugging info for the type has been written.
- In a BLOCK node, nonzero if reorder_blocks has already seen this block. */
+ In a BLOCK node, nonzero if reorder_blocks has already seen this block.
+ In an SSA_NAME node, nonzero if the SSA_NAME occurs in an abnormal
+ PHI node. */
#define TREE_ASM_WRITTEN(NODE) ((NODE)->common.asm_written_flag)
/* Nonzero in a _DECL if the name is used in its scope.
@@ -772,7 +847,10 @@ extern void tree_operand_check_failed (int, enum tree_code,
of this type is aligned at least to the alignment of the type, even if it
doesn't appear that it is. We see this, for example, in object-oriented
languages where a tag field may show this is an object of a more-aligned
- variant of the more generic type. */
+ variant of the more generic type.
+
+ In an SSA_NAME node, nonzero if the SSA_NAME node is on the SSA_NAME
+ freelist. */
#define TYPE_ALIGN_OK(NODE) (TYPE_CHECK (NODE)->common.nothrow_flag)
/* Used in classes in C++. */
@@ -785,6 +863,12 @@ extern void tree_operand_check_failed (int, enum tree_code,
deprecated feature by __attribute__((deprecated)). */
#define TREE_DEPRECATED(NODE) ((NODE)->common.deprecated_flag)
+/* Value of expression is function invariant. A strict subset of
+ TREE_CONSTANT, such an expression is constant over any one function
+ invocation, though not across different invocations. May appear in
+ any expression node. */
+#define TREE_INVARIANT(NODE) ((NODE)->common.invariant_flag)
+
/* These flags are available for each language front end to use internally. */
#define TREE_LANG_FLAG_0(NODE) ((NODE)->common.lang_flag_0)
#define TREE_LANG_FLAG_1(NODE) ((NODE)->common.lang_flag_1)
@@ -924,6 +1008,11 @@ struct tree_vec GTY(())
/* Define fields and accessors for some nodes that represent expressions. */
+/* Non-zero if NODE is an emtpy statement (NOP_EXPR <0>). */
+#define IS_EMPTY_STMT(NODE) (TREE_CODE (NODE) == NOP_EXPR \
+ && VOID_TYPE_P (TREE_TYPE (NODE)) \
+ && integer_zerop (TREE_OPERAND (NODE, 0)))
+
/* In a SAVE_EXPR node. */
#define SAVE_EXPR_CONTEXT(NODE) TREE_OPERAND_CHECK_CODE (NODE, SAVE_EXPR, 1)
#define SAVE_EXPR_RTL(NODE) TREE_RTL_OPERAND_CHECK (NODE, SAVE_EXPR, 2)
@@ -967,36 +1056,331 @@ struct tree_vec GTY(())
/* In a LOOP_EXPR node. */
#define LOOP_EXPR_BODY(NODE) TREE_OPERAND_CHECK_CODE (NODE, LOOP_EXPR, 0)
-/* In an EXPR_WITH_FILE_LOCATION node. */
-#define EXPR_WFL_EMIT_LINE_NOTE(NODE) \
- (EXPR_WITH_FILE_LOCATION_CHECK (NODE)->common.public_flag)
-#define EXPR_WFL_NODE(NODE) \
- TREE_OPERAND_CHECK_CODE (NODE, EXPR_WITH_FILE_LOCATION, 0)
-#define EXPR_WFL_FILENAME_NODE(NODE) \
- TREE_OPERAND_CHECK_CODE (NODE, EXPR_WITH_FILE_LOCATION, 1)
-#define EXPR_WFL_FILENAME(NODE) \
- IDENTIFIER_POINTER (EXPR_WFL_FILENAME_NODE (NODE))
-/* ??? Java uses this in all expressions. */
-#define EXPR_WFL_LINECOL(NODE) (EXPR_CHECK (NODE)->exp.complexity)
-#define EXPR_WFL_LINENO(NODE) (EXPR_WFL_LINECOL (NODE) >> 12)
-#define EXPR_WFL_COLNO(NODE) (EXPR_WFL_LINECOL (NODE) & 0xfff)
-#define EXPR_WFL_SET_LINECOL(NODE, LINE, COL) \
- (EXPR_WFL_LINECOL(NODE) = ((LINE) << 12) | ((COL) & 0xfff))
+/* The source location of this expression. Non-tree_exp nodes such as
+ decls and constants can be shared among multiple locations, so
+ return nothing. */
+#define EXPR_LOCUS(NODE) \
+ (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (NODE))) \
+ ? (NODE)->exp.locus \
+ : (location_t *)NULL)
+#define SET_EXPR_LOCUS(NODE, FROM) \
+ (EXPR_CHECK (NODE)->exp.locus = (FROM))
+#define EXPR_FILENAME(NODE) \
+ (EXPR_CHECK (NODE)->exp.locus->file)
+#define EXPR_LINENO(NODE) \
+ (EXPR_CHECK (NODE)->exp.locus->line)
+#ifdef USE_MAPPED_LOCATION
+#define EXPR_LOCATION(NODE) \
+ (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (NODE))) \
+ ? (NODE)->exp.locus \
+ : UNKNOWN_LOCATION)
+#define EXPR_HAS_LOCATION(NODE) (EXPR_LOCATION (NODE) != UNKNOWN_LOCATION)
+#else
+#define EXPR_LOCATION(NODE) (*EXPR_LOCUS (NODE))
+#define EXPR_HAS_LOCATION(NODE) (EXPR_LOCUS (NODE) != NULL)
+#endif
/* In a TARGET_EXPR node. */
#define TARGET_EXPR_SLOT(NODE) TREE_OPERAND_CHECK_CODE (NODE, TARGET_EXPR, 0)
#define TARGET_EXPR_INITIAL(NODE) TREE_OPERAND_CHECK_CODE (NODE, TARGET_EXPR, 1)
#define TARGET_EXPR_CLEANUP(NODE) TREE_OPERAND_CHECK_CODE (NODE, TARGET_EXPR, 2)
+#define EXIT_EXPR_COND(NODE) TREE_OPERAND (EXIT_EXPR_CHECK (NODE), 0)
+
+/* SWITCH_EXPR accessors. These give access to the condition, body and
+ original condition type (before any compiler conversions)
+ of the switch statement, respectively. */
+#define SWITCH_COND(NODE) TREE_OPERAND ((NODE), 0)
+#define SWITCH_BODY(NODE) TREE_OPERAND ((NODE), 1)
+#define SWITCH_LABELS(NODE) TREE_OPERAND ((NODE), 2)
+
+/* CASE_LABEL accessors. These give access to the high and low values
+ of a case label, respectively. */
+#define CASE_LOW(NODE) TREE_OPERAND ((NODE), 0)
+#define CASE_HIGH(NODE) TREE_OPERAND ((NODE), 1)
+#define CASE_LABEL(NODE) TREE_OPERAND ((NODE), 2)
+
+/* The operands of a BIND_EXPR. */
+#define BIND_EXPR_VARS(NODE) (TREE_OPERAND (BIND_EXPR_CHECK (NODE), 0))
+#define BIND_EXPR_BODY(NODE) (TREE_OPERAND (BIND_EXPR_CHECK (NODE), 1))
+#define BIND_EXPR_BLOCK(NODE) (TREE_OPERAND (BIND_EXPR_CHECK (NODE), 2))
+
+/* GOTO_EXPR accessor. This gives access to the label associated with
+ a goto statement. */
+#define GOTO_DESTINATION(NODE) TREE_OPERAND ((NODE), 0)
+
+/* ASM_STMT accessors. ASM_STRING returns a STRING_CST for the
+ instruction (e.g., "mov x, y"). ASM_OUTPUTS, ASM_INPUTS, and
+ ASM_CLOBBERS represent the outputs, inputs, and clobbers for the
+ statement. */
+#define ASM_STRING(NODE) TREE_OPERAND ((NODE), 0)
+#define ASM_OUTPUTS(NODE) TREE_OPERAND ((NODE), 1)
+#define ASM_INPUTS(NODE) TREE_OPERAND ((NODE), 2)
+#define ASM_CLOBBERS(NODE) TREE_OPERAND ((NODE), 3)
+/* Nonzero if we want to create an ASM_INPUT instead of an
+ ASM_OPERAND with no operands. */
+#define ASM_INPUT_P(NODE) (TREE_STATIC (NODE))
+#define ASM_VOLATILE_P(NODE) (TREE_PUBLIC (NODE))
+
+/* COND_EXPR accessors. */
+#define COND_EXPR_COND(NODE) (TREE_OPERAND (COND_EXPR_CHECK (NODE), 0))
+#define COND_EXPR_THEN(NODE) (TREE_OPERAND (COND_EXPR_CHECK (NODE), 1))
+#define COND_EXPR_ELSE(NODE) (TREE_OPERAND (COND_EXPR_CHECK (NODE), 2))
+
+/* LABEL_EXPR accessor. This gives access to the label associated with
+ the given label expression. */
+#define LABEL_EXPR_LABEL(NODE) TREE_OPERAND (LABEL_EXPR_CHECK (NODE), 0)
+
+/* VDEF_EXPR accessors are specified in tree-flow.h, along with the other
+ accessors for SSA operands. */
+
+/* CATCH_EXPR accessors. */
+#define CATCH_TYPES(NODE) TREE_OPERAND (CATCH_EXPR_CHECK (NODE), 0)
+#define CATCH_BODY(NODE) TREE_OPERAND (CATCH_EXPR_CHECK (NODE), 1)
+
+/* EH_FILTER_EXPR accessors. */
+#define EH_FILTER_TYPES(NODE) TREE_OPERAND (EH_FILTER_EXPR_CHECK (NODE), 0)
+#define EH_FILTER_FAILURE(NODE) TREE_OPERAND (EH_FILTER_EXPR_CHECK (NODE), 1)
+#define EH_FILTER_MUST_NOT_THROW(NODE) TREE_STATIC (EH_FILTER_EXPR_CHECK (NODE))
+
struct tree_exp GTY(())
{
struct tree_common common;
+ location_t *locus;
int complexity;
+ tree block;
tree GTY ((special ("tree_exp"),
desc ("TREE_CODE ((tree) &%0)")))
operands[1];
};
+/* SSA_NAME accessors. */
+
+/* Returns the variable being referenced. Once released, this is the
+ only field that can be relied upon. */
+#define SSA_NAME_VAR(NODE) SSA_NAME_CHECK (NODE)->ssa_name.var
+
+/* Returns the statement which defines this reference. Note that
+ we use the same field when chaining SSA_NAME nodes together on
+ the SSA_NAME freelist. */
+#define SSA_NAME_DEF_STMT(NODE) SSA_NAME_CHECK (NODE)->common.chain
+
+/* Returns the SSA version number of this SSA name. Note that in
+ tree SSA, version numbers are not per variable and may be recycled. */
+#define SSA_NAME_VERSION(NODE) SSA_NAME_CHECK (NODE)->ssa_name.version
+
+/* Nonzero if this SSA name occurs in an abnormal PHI. SSA_NAMES are
+ never output, so we can safely use the ASM_WRITTEN_FLAG for this
+ status bit. */
+#define SSA_NAME_OCCURS_IN_ABNORMAL_PHI(NODE) \
+ SSA_NAME_CHECK (NODE)->common.asm_written_flag
+
+/* Nonzero if this SSA_NAME expression is currently on the freelist of
+ SSA_NAMES. Using NOTHROW_FLAG seems reasonably safe since throwing
+ has no meaning for an SSA_NAME. */
+#define SSA_NAME_IN_FREE_LIST(NODE) \
+ SSA_NAME_CHECK (NODE)->common.nothrow_flag
+
+struct tree_ssa_name GTY(())
+{
+ struct tree_common common;
+
+ /* _DECL wrapped by this SSA name. */
+ tree var;
+
+ /* SSA version number. */
+ unsigned int version;
+};
+
+/* In a PHI_NODE node. */
+#define PHI_RESULT(NODE) PHI_NODE_CHECK (NODE)->phi.result
+
+/* Nonzero if the PHI node was rewritten by a previous pass through the
+ SSA renamer. */
+#define PHI_REWRITTEN(NODE) PHI_NODE_CHECK (NODE)->phi.rewritten
+#define PHI_NUM_ARGS(NODE) PHI_NODE_CHECK (NODE)->phi.num_args
+#define PHI_ARG_CAPACITY(NODE) PHI_NODE_CHECK (NODE)->phi.capacity
+#define PHI_ARG_ELT(NODE, I) PHI_NODE_ELT_CHECK (NODE, I)
+#define PHI_ARG_EDGE(NODE, I) PHI_NODE_ELT_CHECK (NODE, I).e
+#define PHI_ARG_DEF(NODE, I) PHI_NODE_ELT_CHECK (NODE, I).def
+
+struct edge_def;
+
+struct phi_arg_d GTY(())
+{
+ tree def;
+ struct edge_def * GTY((skip (""))) e;
+};
+
+struct tree_phi_node GTY(())
+{
+ struct tree_common common;
+ tree result;
+ int num_args;
+ int capacity;
+
+ /* Nonzero if the PHI node was rewritten by a previous pass through the
+ SSA renamer. */
+ int rewritten;
+
+ struct phi_arg_d GTY ((length ("((tree)&%h)->phi.capacity"))) a[1];
+};
+
+
+struct varray_head_tag;
+
+struct tree_eref_common GTY(())
+{
+ struct tree_common common;
+
+ /* SSAPRE: ID for the EREF. Used only for sorting erefs inside a
+ block. */
+ int id;
+
+ /* SSAPRE: Name for the EREF. Used only for printing.*/
+ tree name;
+
+ /* SSAPRE: The statement associated with this expression reference. */
+ tree stmt;
+
+ /* SSAPRE: True if expression needs to be saved to a temporary. */
+ unsigned int save:1;
+
+ /* SSAPRE: True if expression needs to be reloaded from a temporary. */
+ unsigned int reload:1;
+
+ /* SSAPRE: Redundancy class of expression. */
+ unsigned int class;
+
+ /* SSAPRE: Processed flag 1. */
+ unsigned int processed:1;
+
+ /* SSAPRE: True if expression is injured. */
+ unsigned int injured:1;
+
+ /* SSAPRE: Temporary assigned to this reference. */
+ tree temp;
+
+};
+
+struct tree_euse_node GTY(())
+{
+ struct tree_eref_common common;
+
+ /* SSAPRE: Definition for this use. */
+ tree def;
+
+ /* SSAPRE: True if this is an EPHI operand occurrence. */
+ unsigned int op_occurrence:1;
+
+ /* SSAPRE: True if expression was inserted as a PHI operand occurrence. */
+ unsigned int inserted:1;
+
+ /* SSAPRE: True if expression occurs as a lvalue. */
+ unsigned int lval:1;
+};
+struct ephi_arg_d GTY(())
+{
+
+ /* SSAPRE: True if this phi argument is injured. */
+ unsigned int injured:1;
+
+ /* SSAPRE: True if there is a real occurrence for this phi argument. */
+ unsigned int has_real_use:1;
+
+ /* SSAPRE: True if delayed renaming is required on this phi argument. */
+ unsigned int delayed_rename:1;
+
+ /* SSAPRE: Processed 2 flag for this phi argument. */
+ unsigned int processed2:1;
+
+ /* SSAPRE: True if this operand stops forward movement. */
+ unsigned int stops:1;
+
+ /* SSAPRE: Definition of this phi operand. */
+ tree def;
+
+ /* SSAPRE: Phi predecessor for this phi operand. */
+ tree pred;
+
+ struct edge_def * GTY((skip (""))) e;
+};
+struct tree_ephi_node GTY(())
+{
+ struct tree_eref_common common;
+
+ /* SSAPRE: True if PHI is downsafe. */
+ unsigned int downsafe:1;
+
+ /* SSAPRE: True if PHI is cant_be_avail. */
+ unsigned int cant_be_avail:1;
+
+ /* SSAPRE: True if PHI is dead. */
+ unsigned int dead:1;
+
+ /* SSAPRE: True if PHI is pointless or identical to some value. */
+ unsigned int identity:1;
+
+ /* SSAPRE: True if replacing occurrence known for ESSA minimization. */
+ unsigned int rep_occur_known:1;
+
+ /* SSAPRE: True if PHI is pointless, but is also injured. */
+ unsigned int ident_injured:1;
+
+ /* SSAPRE: True if this PHI stops forward movement. */
+ unsigned int stops:1;
+
+ /* SSAPRE: If PHI's replacing occurrence is known, this is it. */
+ tree identical_to;
+
+ /* SSAPRE: Uses of this ephi. */
+ struct varray_head_tag *uses;
+
+ int num_args;
+ int capacity;
+ struct ephi_arg_d GTY ((length ("((tree)&%h)->ephi.capacity"))) a[1];
+
+};
+/* In both EPHI's and EUSES */
+#define EREF_PROCESSED(NODE) EREF_NODE_CHECK (NODE)->eref.processed
+#define EREF_ID(NODE) EREF_NODE_CHECK (NODE)->eref.id
+#define EREF_NAME(NODE) EREF_NODE_CHECK (NODE)->eref.name
+#define EREF_STMT(NODE) EREF_NODE_CHECK (NODE)->eref.stmt
+#define EREF_RELOAD(NODE) EREF_NODE_CHECK (NODE)->eref.reload
+#define EREF_SAVE(NODE) EREF_NODE_CHECK (NODE)->eref.save
+#define EREF_CLASS(NODE) EREF_NODE_CHECK (NODE)->eref.class
+#define EREF_INJURED(NODE) EREF_NODE_CHECK (NODE)->eref.injured
+#define EREF_TEMP(NODE) EREF_NODE_CHECK (NODE)->eref.temp
+
+/* In a EUSE_NODE node. */
+#define EUSE_DEF(NODE) EUSE_NODE_CHECK (NODE)->euse.def
+#define EUSE_PHIOP(NODE) EUSE_NODE_CHECK (NODE)->euse.op_occurrence
+#define EUSE_INSERTED(NODE) EUSE_NODE_CHECK (NODE)->euse.inserted
+#define EUSE_LVAL(NODE) EUSE_NODE_CHECK (NODE)->euse.lval
+
+/* In a EPHI_NODE node. */
+#define EPHI_NUM_ARGS(NODE) EPHI_NODE_CHECK (NODE)->ephi.num_args
+#define EPHI_ARG_CAPACITY(NODE) EPHI_NODE_CHECK (NODE)->ephi.capacity
+#define EPHI_ARG_ELT(NODE, I) EPHI_NODE_ELT_CHECK (NODE, I)
+#define EPHI_ARG_EDGE(NODE, I) EPHI_NODE_ELT_CHECK (NODE, I).e
+#define EPHI_ARG_PRED(NODE, I) EPHI_NODE_ELT_CHECK (NODE, I).pred
+#define EPHI_ARG_DEF(NODE, I) EPHI_NODE_ELT_CHECK (NODE, I).def
+#define EPHI_ARG_INJURED(NODE, I) EPHI_NODE_ELT_CHECK (NODE, I).injured
+#define EPHI_ARG_DELAYED_RENAME(NODE, I) EPHI_NODE_ELT_CHECK (NODE, I).delayed_rename
+#define EPHI_ARG_HAS_REAL_USE(NODE, I) EPHI_NODE_ELT_CHECK (NODE, I).has_real_use
+#define EPHI_ARG_STOPS(NODE, I) EPHI_NODE_ELT_CHECK (NODE, I).stops
+#define EPHI_ARG_PROCESSED2(NODE, I) EPHI_NODE_ELT_CHECK (NODE, I).processed2
+#define EPHI_IDENTITY(NODE) EPHI_NODE_CHECK (NODE)->ephi.identity
+#define EPHI_IDENT_INJURED(NODE) EPHI_NODE_CHECK (NODE)->ephi.ident_injured
+
+#define EPHI_REP_OCCUR_KNOWN(NODE) EPHI_NODE_CHECK (NODE)->ephi.rep_occur_known
+#define EPHI_IDENTICAL_TO(NODE) EPHI_NODE_CHECK (NODE)->ephi.identical_to
+#define EPHI_DOWNSAFE(NODE) EPHI_NODE_CHECK (NODE)->ephi.downsafe
+#define EPHI_CANT_BE_AVAIL(NODE) EPHI_NODE_CHECK (NODE)->ephi.cant_be_avail
+#define EPHI_DEAD(NODE) EPHI_NODE_CHECK (NODE)->ephi.dead
+#define EPHI_USES(NODE) EPHI_NODE_CHECK (NODE)->ephi.uses
+#define EPHI_STOPS(NODE) EPHI_NODE_CHECK (NODE)->ephi.stops
+
/* In a BLOCK node. */
#define BLOCK_VARS(NODE) (BLOCK_CHECK (NODE)->block.vars)
#define BLOCK_SUBBLOCKS(NODE) (BLOCK_CHECK (NODE)->block.subblocks)
@@ -1198,6 +1582,10 @@ struct tree_block GTY(())
#define TYPE_LANG_FLAG_5(NODE) (TYPE_CHECK (NODE)->type.lang_flag_5)
#define TYPE_LANG_FLAG_6(NODE) (TYPE_CHECK (NODE)->type.lang_flag_6)
+/* Used to keep track of visited nodes in tree traversals. This is set to
+ 0 by copy_node and make_node. */
+#define TREE_VISITED(NODE) ((NODE)->common.visited)
+
/* If set in an ARRAY_TYPE, indicates a string type (for languages
that distinguish string from array of char).
If set in a SET_TYPE, indicates a bitstring type. */
@@ -1384,6 +1772,16 @@ struct tree_type GTY(())
/* Nonzero if DECL represents a decl. */
#define DECL_P(DECL) (TREE_CODE_CLASS (TREE_CODE (DECL)) == 'd')
+/* Nonzero if DECL represents a variable for the SSA passes. */
+#define SSA_VAR_P(DECL) \
+ (TREE_CODE (DECL) == VAR_DECL \
+ || TREE_CODE (DECL) == PARM_DECL \
+ || TREE_CODE (DECL) == RESULT_DECL \
+ || (TREE_CODE (DECL) == SSA_NAME \
+ && (TREE_CODE (SSA_NAME_VAR (DECL)) == VAR_DECL \
+ || TREE_CODE (SSA_NAME_VAR (DECL)) == PARM_DECL \
+ || TREE_CODE (SSA_NAME_VAR (DECL)) == RESULT_DECL)))
+
/* This is the name of the object as written by the user.
It is an IDENTIFIER_NODE. */
#define DECL_NAME(NODE) (DECL_CHECK (NODE)->decl.name)
@@ -1533,6 +1931,12 @@ struct tree_type GTY(())
this identifies which built-in operation it is. */
#define DECL_FUNCTION_CODE(NODE) (FUNCTION_DECL_CHECK (NODE)->decl.u1.f)
+/* In a FUNCTION_DECL for which DECL_BUILT_IN does not hold, this is
+ the approximate number of statements in this function. There is
+ no need for this number to be exact; it is only used in various
+ heuristics regarding optimization. */
+#define DECL_NUM_STMTS(NODE) (FUNCTION_DECL_CHECK (NODE)->decl.u1.i)
+
/* The DECL_VINDEX is used for FUNCTION_DECLS in two different ways.
Before the struct containing the FUNCTION_DECL is laid out,
DECL_VINDEX may point to a FUNCTION_DECL in a base class which
@@ -1647,6 +2051,10 @@ struct tree_type GTY(())
#define DECL_DECLARED_INLINE_P(NODE) \
(FUNCTION_DECL_CHECK (NODE)->decl.declared_inline_flag)
+/* In a VAR_DECL, nonzero if the decl is a register variable with
+ an explicit asm specification. */
+#define DECL_HARD_REGISTER(NODE) (DECL_CHECK (NODE)->decl.inline_flag)
+
/* Value of the decls's visibility attribute */
#define DECL_VISIBILITY(NODE) (DECL_CHECK (NODE)->decl.visibility)
@@ -1774,6 +2182,16 @@ struct tree_type GTY(())
#define DECL_POINTER_ALIAS_SET(NODE) \
(DECL_CHECK (NODE)->decl.pointer_alias_set)
+/* Used to store the alias_var for a DECL node. */
+#define DECL_PTA_ALIASVAR(NODE) \
+ (DECL_CHECK (NODE)->decl.alias_var)
+
+/* A numeric unique identifier for a LABEL_DECL. The UID allocation is
+ dense, unique within any one function, and may be used to index arrays.
+ If the value is -1, then no UID has been assigned. */
+#define LABEL_DECL_UID(NODE) \
+ (LABEL_DECL_CHECK (NODE)->decl.pointer_alias_set)
+
/* Nonzero if an alias set has been assigned to this declaration. */
#define DECL_POINTER_ALIAS_SET_KNOWN_P(NODE) \
(DECL_POINTER_ALIAS_SET (NODE) != - 1)
@@ -1783,6 +2201,15 @@ struct tree_type GTY(())
(! DECL_CONTEXT (EXP) \
|| TREE_CODE (DECL_CONTEXT (EXP)) == TRANSLATION_UNIT_DECL)
+/* Nonzero for a decl that has been marked as needing a memory slot.
+ NOTE: Never use this macro directly. It will give you incomplete
+ information. Most of the time this bit will only be set after alias
+ analysis in the tree optimizers. It's always better to call
+ needs_to_live_in_memory instead. To mark memory variables use
+ mark_call_clobbered. */
+#define DECL_NEEDS_TO_LIVE_IN_MEMORY_INTERNAL(DECL) \
+ DECL_CHECK (DECL)->decl.needs_to_live_in_memory
+
/* Enumerate visibility settings. */
enum symbol_visibility
@@ -1794,7 +2221,7 @@ enum symbol_visibility
};
struct function;
-
+union alias_var_def;
struct tree_decl GTY(())
{
struct tree_common common;
@@ -1834,9 +2261,8 @@ struct tree_decl GTY(())
unsigned uninlinable : 1;
unsigned thread_local_flag : 1;
unsigned declared_inline_flag : 1;
+ unsigned seen_in_bind_expr : 1;
ENUM_BITFIELD(symbol_visibility) visibility : 2;
- unsigned unused : 1;
- /* one unused bit. */
unsigned lang_flag_0 : 1;
unsigned lang_flag_1 : 1;
@@ -1847,6 +2273,9 @@ struct tree_decl GTY(())
unsigned lang_flag_6 : 1;
unsigned lang_flag_7 : 1;
+ unsigned needs_to_live_in_memory : 1;
+ /* 15 unused bits. */
+
union tree_decl_u1 {
/* In a FUNCTION_DECL for which DECL_BUILT_IN holds, this is
DECL_FUNCTION_CODE. */
@@ -1895,9 +2324,38 @@ struct tree_decl GTY(())
tree vindex;
HOST_WIDE_INT pointer_alias_set;
+ union alias_var_def *GTY ((skip(""))) alias_var;
/* Points to a structure whose details depend on the language in use. */
struct lang_decl *lang_specific;
};
+
+
+/* A STATEMENT_LIST chains statements together in GENERIC and GIMPLE.
+ To reduce overhead, the nodes containing the statements are not trees.
+ This avoids the overhead of tree_common on all linked list elements.
+
+ Use the interface in tree-iterator.h to access this node. */
+
+#define STATEMENT_LIST_HEAD(NODE) \
+ (STATEMENT_LIST_CHECK (NODE)->stmt_list.head)
+#define STATEMENT_LIST_TAIL(NODE) \
+ (STATEMENT_LIST_CHECK (NODE)->stmt_list.tail)
+
+struct tree_statement_list_node
+ GTY ((chain_next ("%h.next"), chain_prev ("%h.prev")))
+{
+ struct tree_statement_list_node *prev;
+ struct tree_statement_list_node *next;
+ tree stmt;
+};
+
+struct tree_statement_list
+ GTY(())
+{
+ struct tree_common common;
+ struct tree_statement_list_node *head;
+ struct tree_statement_list_node *tail;
+};
enum tree_node_structure_enum {
TS_COMMON,
@@ -1912,7 +2370,13 @@ enum tree_node_structure_enum {
TS_LIST,
TS_VEC,
TS_EXP,
+ TS_SSA_NAME,
+ TS_PHI_NODE,
+ TS_EPHI_NODE,
+ TS_EUSE_NODE,
+ TS_EREF_NODE,
TS_BLOCK,
+ TS_STATEMENT_LIST,
LAST_TS_ENUM
};
@@ -1935,8 +2399,14 @@ union tree_node GTY ((ptr_alias (union lang_tree_node),
struct tree_list GTY ((tag ("TS_LIST"))) list;
struct tree_vec GTY ((tag ("TS_VEC"))) vec;
struct tree_exp GTY ((tag ("TS_EXP"))) exp;
+ struct tree_ssa_name GTY ((tag ("TS_SSA_NAME"))) ssa_name;
+ struct tree_phi_node GTY ((tag ("TS_PHI_NODE"))) phi;
+ struct tree_eref_common GTY ((tag ("TS_EREF_NODE"))) eref;
+ struct tree_ephi_node GTY ((tag ("TS_EPHI_NODE"))) ephi;
+ struct tree_euse_node GTY ((tag ("TS_EUSE_NODE"))) euse;
struct tree_block GTY ((tag ("TS_BLOCK"))) block;
- };
+ struct tree_statement_list GTY ((tag ("TS_STATEMENT_LIST"))) stmt_list;
+};
/* Standard named or nameless data types of the C compiler. */
@@ -2183,6 +2653,24 @@ extern tree copy_list (tree);
extern tree make_tree_vec_stat (int MEM_STAT_DECL);
#define make_tree_vec(t) make_tree_vec_stat (t MEM_STAT_INFO)
+/* Tree nodes for SSA analysis. */
+
+extern tree make_phi_node (tree, int);
+extern void init_phinodes (void);
+extern void fini_phinodes (void);
+extern void release_phi_node (tree);
+#ifdef GATHER_STATISTICS
+extern void phinodes_print_statistics (void);
+#endif
+
+extern void init_ssanames (void);
+extern void fini_ssanames (void);
+extern tree make_ssa_name (tree, tree);
+extern void release_ssa_name (tree);
+#ifdef GATHER_STATISTICS
+extern void ssanames_print_statistics (void);
+#endif
+
/* Return the (unique) IDENTIFIER_NODE node for a given name.
The name is supplied as a char *. */
@@ -2250,7 +2738,9 @@ extern tree build_tree_list_stat (tree, tree MEM_STAT_DECL);
extern tree build_decl_stat (enum tree_code, tree, tree MEM_STAT_DECL);
#define build_decl(c,t,q) build_decl_stat (c,t,q MEM_STAT_INFO)
extern tree build_block (tree, tree, tree, tree, tree);
-extern tree build_expr_wfl (tree, const char *, int, int);
+extern void annotate_with_file_line (tree, const char *, int);
+extern void annotate_with_locus (tree, location_t);
+extern tree build_empty_stmt (void);
/* Construct various nodes representing data types. */
@@ -2540,7 +3030,7 @@ extern tree convert (tree, tree);
extern unsigned int expr_align (tree);
extern tree expr_first (tree);
extern tree expr_last (tree);
-extern int expr_length (tree);
+extern tree expr_only (tree);
extern tree size_in_bytes (tree);
extern HOST_WIDE_INT int_size_in_bytes (tree);
extern tree bit_position (tree);
@@ -2633,11 +3123,14 @@ extern int fields_length (tree);
extern bool initializer_zerop (tree);
-/* Given an initializer INIT, return TRUE if INIT is at least 3/4 zeros.
- Otherwise return FALSE. */
-
+extern void categorize_ctor_elements (tree, HOST_WIDE_INT *, HOST_WIDE_INT *);
+extern HOST_WIDE_INT count_type_elements (tree);
extern int mostly_zeros_p (tree);
+/* add_var_to_bind_expr (bind_expr, var) binds var to bind_expr. */
+
+extern void add_var_to_bind_expr (tree, tree);
+
/* integer_zerop (tree x) is nonzero if X is an integer constant of value 0 */
extern int integer_zerop (tree);
@@ -2825,13 +3318,6 @@ extern tree decl_function_context (tree);
this _DECL with its context, or zero if none. */
extern tree decl_type_context (tree);
-/* Given the FUNCTION_DECL for the current function,
- return zero if it is ok for this function to be inline.
- Otherwise return a warning message with a single %s
- for the function's name. */
-
-extern const char *function_cannot_inline_p (tree);
-
/* Return 1 if EXPR is the real constant zero. */
extern int real_zerop (tree);
@@ -2854,6 +3340,11 @@ extern GTY(()) tree current_function_decl;
/* Nonzero means a FUNC_BEGIN label was emitted. */
extern GTY(()) tree current_function_func_begin_label;
+/* A DECL for the current file-scope context. When using IMA, this heads a
+ chain of FILE_DECLs; currently only C uses it. */
+
+extern GTY(()) tree current_file_decl;
+
/* Nonzero means all ..._TYPE nodes should be allocated permanently. */
extern int all_types_permanent;
@@ -2877,6 +3368,7 @@ extern tree get_callee_fndecl (tree);
extern void change_decl_assembler_name (tree, tree);
extern int type_num_arguments (tree);
extern tree lhd_unsave_expr_now (tree);
+extern bool is_essa_node (tree);
extern bool associative_tree_code (enum tree_code);
extern bool commutative_tree_code (enum tree_code);
@@ -2910,6 +3402,9 @@ extern int expand_exit_loop_if_false (struct nesting *,tree);
extern int expand_exit_loop_top_cond (struct nesting *, tree);
extern int expand_exit_something (void);
+extern void expand_stack_alloc (tree, tree);
+extern rtx expand_stack_save (void);
+extern void expand_stack_restore (tree);
extern void expand_return (tree);
extern int optimize_tail_recursion (tree, rtx);
extern void expand_start_bindings_and_block (int, tree);
@@ -2927,7 +3422,7 @@ extern tree last_cleanup_this_contour (void);
extern void expand_start_case (int, tree, tree, const char *);
extern void expand_end_case_type (tree, tree);
#define expand_end_case(cond) expand_end_case_type (cond, NULL)
-extern int add_case_node (tree, tree, tree, tree *);
+extern int add_case_node (tree, tree, tree, tree *, bool);
extern int pushcase (tree, tree (*) (tree, tree), tree, tree *);
extern int pushcase_range (tree, tree, tree (*) (tree, tree), tree, tree *);
extern void using_eh_for_cleanups (void);
@@ -2973,15 +3468,29 @@ extern int div_and_round_double (enum tree_code, int, unsigned HOST_WIDE_INT,
HOST_WIDE_INT *, unsigned HOST_WIDE_INT *,
HOST_WIDE_INT *);
-extern int operand_equal_p (tree, tree, int);
+enum operand_equal_flag
+{
+ OEP_ONLY_CONST = 1,
+ OEP_PURE_SAME = 2
+};
+
+extern int operand_equal_p (tree, tree, unsigned int);
+
extern tree omit_one_operand (tree, tree, tree);
extern tree invert_truthvalue (tree);
+extern tree nondestructive_fold_unary_to_constant (enum tree_code, tree, tree);
+extern tree nondestructive_fold_binary_to_constant (enum tree_code, tree, tree, tree);
+extern tree fold_read_from_constant_string (tree);
+extern tree int_const_binop (enum tree_code, tree, tree, int);
/* In builtins.c */
extern tree fold_builtin (tree);
extern enum built_in_function builtin_mathfn_code (tree);
extern tree build_function_call_expr (tree, tree);
extern tree mathfn_built_in (tree, enum built_in_function fn);
+extern tree strip_float_extensions (tree);
+extern tree simplify_builtin (tree, int);
+extern tree c_strlen (tree, int);
/* In convert.c */
extern tree strip_float_extensions (tree);
@@ -3012,6 +3521,9 @@ extern void dump_tree_statistics (void);
extern void expand_function_end (void);
extern void expand_function_start (tree, int);
extern void expand_pending_sizes (tree);
+extern void recompute_tree_invarant_for_addr_expr (tree);
+extern bool needs_to_live_in_memory (tree);
+extern tree make_vector (enum machine_mode, tree, int);
extern tree reconstruct_complex_type (tree, tree);
extern int real_onep (tree);
@@ -3034,7 +3546,7 @@ extern void init_function_start (tree);
extern void assign_parms (tree);
extern void put_var_into_stack (tree, int);
extern void flush_addressof (tree);
-extern void uninitialized_vars_warning (tree);
+extern void setjmp_vars_warning (tree);
extern void setjmp_args_warning (void);
extern void mark_all_temps_used (void);
extern void init_temp_slots (void);
@@ -3123,16 +3635,15 @@ extern bool alloca_call_p (tree);
extern tree decl_attributes (tree *, tree, int);
/* In integrate.c */
-extern void save_for_inline (tree);
extern void set_decl_abstract_flags (tree, int);
-extern void output_inline_function (tree);
extern void set_decl_origin_self (tree);
/* In stor-layout.c */
extern void set_min_and_max_values_for_integral_type (tree, int, bool);
extern void fixup_signed_type (tree);
extern void internal_reference_types (void);
-
+extern unsigned int update_alignment_for_field (record_layout_info, tree,
+ unsigned int);
/* varasm.c */
extern void make_decl_rtl (tree, const char *);
extern void make_decl_one_only (tree);
@@ -3151,6 +3662,8 @@ extern bool parse_output_constraint (const char **, int, int, int,
extern bool parse_input_constraint (const char **, int, int, int, int,
const char * const *, bool *, bool *);
extern void expand_asm_operands (tree, tree, tree, tree, int, location_t);
+extern void expand_asm_expr (tree);
+extern bool asm_op_is_mem_input (tree, tree);
extern tree resolve_asm_operand_names (tree, tree, tree);
extern int any_pending_cleanups (void);
extern void init_stmt_for_function (void);
@@ -3162,9 +3675,13 @@ extern void expand_decl (tree);
extern int expand_decl_cleanup (tree, tree);
extern int expand_decl_cleanup_eh (tree, tree, int);
extern void expand_anon_union_decl (tree, tree, tree);
-extern HOST_WIDE_INT all_cases_count (tree, int *);
-extern void check_for_full_enumeration_handling (tree);
-extern void declare_nonlocal_label (tree);
+extern int containing_blocks_have_cleanups_or_stack_level (void);
+
+/* In gimplify.c. */
+extern tree create_artificial_label (void);
+extern void gimplify_function_tree (tree);
+extern const char *get_name (tree);
+extern tree unshare_expr (tree);
/* If KIND=='I', return a suitable global initializer (constructor) name.
If KIND=='D', return a suitable global clean-up (destructor) name. */
@@ -3201,22 +3718,30 @@ extern void dwarf2out_return_save (const char *, HOST_WIDE_INT);
extern void dwarf2out_return_reg (const char *, unsigned);
-/* The type of a function that walks over tree structure. */
+/* The type of a callback function for walking over tree structure. */
typedef tree (*walk_tree_fn) (tree *, int *, void *);
+tree walk_tree (tree*, walk_tree_fn, void*, void*);
+tree walk_tree_without_duplicates (tree*, walk_tree_fn, void*);
/* In tree-dump.c */
/* Different tree dump places. When you add new tree dump places,
- extend the DUMP_FILES array in tree-dump.c */
+ extend the DUMP_FILES array in tree-dump.c. */
enum tree_dump_index
{
- TDI_all, /* dump the whole translation unit */
- TDI_class, /* dump class hierarchy */
+ TDI_none, /* No dump */
+ TDI_tu, /* dump the whole translation unit. */
+ TDI_class, /* dump class hierarchy. */
TDI_original, /* dump each function before optimizing it */
- TDI_optimized, /* dump each function after optimizing it */
+ TDI_generic, /* dump each function after genericizing it */
+ TDI_nested, /* dump each function after unnesting it */
TDI_inlined, /* dump each function after inlining
within it. */
+ TDI_vcg, /* create a VCG graph file for each
+ function's flowgraph. */
+ TDI_xml, /* dump function call graph. */
+ TDI_all, /* enable all the dumps. */
TDI_end
};
@@ -3225,6 +3750,16 @@ enum tree_dump_index
values, extend the DUMP_OPTIONS array in tree-dump.c */
#define TDF_ADDRESS (1 << 0) /* dump node addresses */
#define TDF_SLIM (1 << 1) /* don't go wild following links */
+#define TDF_RAW (1 << 2) /* don't unparse the function */
+#define TDF_DETAILS (1 << 3) /* show more detailed info about
+ each pass */
+#define TDF_STATS (1 << 4) /* dump various statistics about
+ each pass */
+#define TDF_BLOCKS (1 << 5) /* display basic block boundaries */
+#define TDF_VOPS (1 << 6) /* display virtual operands */
+#define TDF_LINENO (1 << 7) /* display statement line numbers */
+#define TDF_UID (1 << 8) /* display decl UIDs */
+
typedef struct dump_info *dump_info_p;
@@ -3265,6 +3800,8 @@ typedef enum
perm_list_kind,
temp_list_kind,
vec_kind,
+ phi_kind,
+ ssa_name_kind,
x_kind,
lang_decl,
lang_type,
@@ -3273,5 +3810,10 @@ typedef enum
extern int tree_node_counts[];
extern int tree_node_sizes[];
+
+/* True if we are in gimple form and the actions of the folders need to
+ be restricted. False if we are not in gimple form and folding is not
+ restricted to creating gimple expressions. */
+extern bool in_gimple_form;
#endif /* GCC_TREE_H */