summaryrefslogtreecommitdiff
path: root/gcc/tree-gimple.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/tree-gimple.h')
-rw-r--r--gcc/tree-gimple.h84
1 files changed, 84 insertions, 0 deletions
diff --git a/gcc/tree-gimple.h b/gcc/tree-gimple.h
index 83c17fbad7a..ff1a6d20a39 100644
--- a/gcc/tree-gimple.h
+++ b/gcc/tree-gimple.h
@@ -109,6 +109,21 @@ enum gimplify_status {
GS_ALL_DONE = 1 /* The expression is fully gimplified. */
};
+/* Type of parallel constructs. Used to decide what runtime function
+ to use for launching children threads and the gimplification
+ strategy. */
+
+enum omp_parallel_type {
+ IS_NOT_PARALLEL = 0,
+
+ /* Regular omp parallel */
+ IS_PARALLEL,
+
+ /* Combined parallel + workshare (parallel loop and parallel
+ sections). */
+ IS_COMBINED_PARALLEL
+};
+
extern enum gimplify_status gimplify_expr (tree *, tree *, tree *,
bool (*) (tree), fallback_t);
extern void gimplify_type_sizes (tree, tree *);
@@ -130,8 +145,77 @@ extern tree alloc_stmt_list (void);
extern void free_stmt_list (tree);
extern tree force_labels_r (tree *, int *, void *);
extern enum gimplify_status gimplify_va_arg_expr (tree *, tree *, tree *);
+struct gimplify_omp_ctx;
+extern void omp_firstprivatize_variable (struct gimplify_omp_ctx *, tree);
+
+/* In omp-low.c. */
+extern tree find_omp_clause (tree, enum tree_code);
+extern void diagnose_omp_structured_block_errors (tree);
+extern tree omp_reduction_init (tree, tree);
+enum omp_parallel_type determine_parallel_type (tree stmt);
/* In tree-nested.c. */
extern void lower_nested_functions (tree);
+extern void insert_field_into_struct (tree, tree);
+
+/* Convenience routines to walk all statements of a gimple function.
+ The difference between these walkers and the generic walk_tree is
+ that walk_stmt provides context information to the callback
+ routine to know whether it is currently on the LHS or RHS of an
+ assignment (IS_LHS) or contexts where only GIMPLE values are
+ allowed (VAL_ONLY).
+
+ This is useful in walkers that need to re-write sub-expressions
+ inside statements while making sure the result is still in GIMPLE
+ form.
+
+ Note that this is useful exclusively before the code is converted
+ into SSA form. Once the program is in SSA form, the standard
+ operand interface should be used to analyze/modify statements. */
+
+struct walk_stmt_info
+{
+ /* For each statement, we invoke CALLBACK via walk_tree. The passed
+ data is a walk_stmt_info structure. */
+ walk_tree_fn callback;
+
+ /* Points to the current statement being walked. */
+ tree_stmt_iterator tsi;
+
+ /* Additional data that CALLBACK may want to carry through the
+ recursion. */
+ void *info;
+
+ /* Indicates whether the *TP being examined may be replaced
+ with something that matches is_gimple_val (if true) or something
+ slightly more complicated (if false). "Something" technically
+ means the common subset of is_gimple_lvalue and is_gimple_rhs,
+ but we never try to form anything more complicated than that, so
+ we don't bother checking.
+
+ Also note that CALLBACK should update this flag while walking the
+ sub-expressions of a statement. For instance, when walking the
+ statement 'foo (&var)', the flag VAL_ONLY will initially be set
+ to true, however, when walking &var, the operand of that
+ ADDR_EXPR does not need to be a GIMPLE value. */
+ bool val_only;
+
+ /* True if we are currently walking the LHS of an assignment. */
+ bool is_lhs;
+
+ /* Optional. Set to true by CALLBACK if it made any changes. */
+ bool changed;
+
+ /* True if we're interested in seeing BIND_EXPRs. */
+ bool want_bind_expr;
+
+ /* True if we're interested in seeing RETURN_EXPRs. */
+ bool want_return_expr;
+
+ /* True if we're interested in location information. */
+ bool want_locations;
+};
+
+void walk_stmts (struct walk_stmt_info *, tree *);
#endif /* _TREE_SIMPLE_H */