* tree-flow.h: Remove some prototypes.
* tree.h: Remove some protypes, add a couple.
* tree.c (using_eh_for_cleanups_flag, using_eh_for_cleanups,
using_eh_for_cleanups_p): Add interface routines for front ends.
* tree-eh.h: New file. Add protoptyes.
* tree-eh.c (using_eh_for_cleanups_p, using_eh_for_cleanups): Delete.
(add_stmt_to_eh_lp_fn): Make static.
(lower_try_finally): Use new using_eh_for_cleanups_p.
* emit-rtl.c: Include tree-eh.h.
* gimple.h: Include tree-eh.h.
===================================================================
*************** enum move_pos
extern enum move_pos movement_possibility (gimple);
char *get_lsm_tmp_name (tree, unsigned);
- /* In tree-flow-inline.h */
- static inline bool unmodifiable_var_p (const_tree);
- static inline bool ref_contains_array_ref (const_tree);
-
- /* In tree-eh.c */
- extern void make_eh_edges (gimple);
- extern bool make_eh_dispatch_edges (gimple);
- extern edge redirect_eh_edge (edge, basic_block);
- extern void redirect_eh_dispatch_edge (gimple, edge, basic_block);
- extern bool stmt_could_throw_p (gimple);
- extern bool stmt_can_throw_internal (gimple);
- extern bool stmt_can_throw_external (gimple);
- extern void add_stmt_to_eh_lp_fn (struct function *, gimple, int);
- extern void add_stmt_to_eh_lp (gimple, int);
- extern bool remove_stmt_from_eh_lp (gimple);
- extern bool remove_stmt_from_eh_lp_fn (struct function *, gimple);
- extern int lookup_stmt_eh_lp_fn (struct function *, gimple);
- extern int lookup_stmt_eh_lp (gimple);
- extern bool maybe_clean_eh_stmt_fn (struct function *, gimple);
- extern bool maybe_clean_eh_stmt (gimple);
- extern bool maybe_clean_or_replace_eh_stmt (gimple, gimple);
- extern bool maybe_duplicate_eh_stmt_fn (struct function *, gimple,
- struct function *, gimple,
- struct pointer_map_t *, int);
- extern bool maybe_duplicate_eh_stmt (gimple, gimple);
- extern bool verify_eh_edges (gimple);
- extern bool verify_eh_dispatch_edge (gimple);
- extern void maybe_remove_unreachable_handlers (void);
-
- /* In tree-ssa-pre.c */
- void debug_value_expressions (unsigned int);
-
/* In tree-loop-linear.c */
extern void linear_transform_loops (void);
extern unsigned perfect_loop_nest_depth (struct loop *);
===================================================================
*************** extern rtx expand_stack_save (void);
extern void expand_stack_restore (tree);
extern void expand_return (tree);
- /* In tree-eh.c */
- extern void using_eh_for_cleanups (void);
-
- extern bool tree_could_trap_p (tree);
- extern bool operation_could_trap_helper_p (enum tree_code, bool, bool, bool,
- bool, tree, bool *);
- extern bool operation_could_trap_p (enum tree_code, bool, bool, tree);
- extern bool tree_could_throw_p (tree);
-
/* Compare and hash for any structure which begins with a canonical
pointer. Assumes all pointers are interchangeable, which is sort
of already assumed by gcc elsewhere IIRC. */
*************** extern bool types_same_for_odr (tree typ
extern bool contains_bitfld_component_ref_p (const_tree);
extern bool type_in_anonymous_namespace_p (tree);
extern bool block_may_fallthru (const_tree);
+ extern void using_eh_for_cleanups (void);
+ extern bool using_eh_for_cleanups_p (void);
/* In tree-nested.c */
extern tree build_addr (tree, tree);
===================================================================
*************** block_may_fallthru (const_tree block)
}
}
+ /* True if we are using EH to handle cleanups. */
+ static bool using_eh_for_cleanups_flag = false;
+
+ /* This routine is called from front ends to indicate eh should be used for
+ cleanups. */
+ void
+ using_eh_for_cleanups (void)
+ {
+ using_eh_for_cleanups_flag = true;
+ }
+
+ /* Query whether EH is used for cleanups. */
+ bool
+ using_eh_for_cleanups_p (void)
+ {
+ return using_eh_for_cleanups_flag;
+ }
+
#include "gt-tree.h"
===================================================================
***************
+ /* Header file for exception handling.
+ Copyright (C) 2013 Free Software Foundation, Inc.
+
+ This file is part of GCC.
+
+ GCC is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 3, or (at your option) any later
+ version.
+
+ GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING3. If not see
+ <http://www.gnu.org/licenses/>. */
+
+ #ifndef GCC_TREE_EH_H
+ #define GCC_TREE_EH_H
+
+ extern void using_eh_for_cleanups (void);
+ extern void add_stmt_to_eh_lp (gimple, int);
+ extern bool remove_stmt_from_eh_lp_fn (struct function *, gimple);
+ extern bool remove_stmt_from_eh_lp (gimple);
+ extern int lookup_stmt_eh_lp_fn (struct function *, gimple);
+ extern int lookup_stmt_eh_lp (gimple);
+ extern bool make_eh_dispatch_edges (gimple);
+ extern void make_eh_edges (gimple);
+ extern edge redirect_eh_edge (edge, basic_block);
+ extern void redirect_eh_dispatch_edge (gimple, edge, basic_block);
+ extern bool operation_could_trap_helper_p (enum tree_code, bool, bool, bool,
+ bool, tree, bool *);
+ extern bool operation_could_trap_p (enum tree_code, bool, bool, tree);
+ extern bool tree_could_trap_p (tree);
+ extern bool stmt_could_throw_p (gimple);
+ extern bool tree_could_throw_p (tree);
+ extern bool stmt_can_throw_external (gimple);
+ extern bool stmt_can_throw_internal (gimple);
+ extern bool maybe_clean_eh_stmt_fn (struct function *, gimple);
+ extern bool maybe_clean_eh_stmt (gimple);
+ extern bool maybe_clean_or_replace_eh_stmt (gimple, gimple);
+ extern bool maybe_duplicate_eh_stmt_fn (struct function *, gimple,
+ struct function *, gimple,
+ struct pointer_map_t *, int);
+ extern bool maybe_duplicate_eh_stmt (gimple, gimple);
+ extern void maybe_remove_unreachable_handlers (void);
+ extern bool verify_eh_edges (gimple);
+ extern bool verify_eh_dispatch_edge (gimple);
+
+ #endif /* GCC_TREE_EH_H */
===================================================================
*************** along with GCC; see the file COPYING3.
i.e. in hash tables. This is a structure to do this. */
typedef union {tree *tp; tree t; gimple g;} treemple;
- /* Nonzero if we are using EH to handle cleanups. */
- static int using_eh_for_cleanups_p = 0;
-
- void
- using_eh_for_cleanups (void)
- {
- using_eh_for_cleanups_p = 1;
- }
-
/* Misc functions used in this file. */
/* Remember and lookup EH landing pad data for arbitrary statements.
*************** using_eh_for_cleanups (void)
/* Add statement T in function IFUN to landing pad NUM. */
! void
add_stmt_to_eh_lp_fn (struct function *ifun, gimple t, int num)
{
struct throw_stmt_node *n;
/* Add statement T in function IFUN to landing pad NUM. */
! static void
add_stmt_to_eh_lp_fn (struct function *ifun, gimple t, int num)
{
struct throw_stmt_node *n;
*************** lower_try_finally (struct leh_state *sta
this_tf.try_finally_expr = tp;
this_tf.top_p = tp;
this_tf.outer = state;
! if (using_eh_for_cleanups_p && !cleanup_is_dead_in (state->cur_region))
{
this_tf.region = gen_eh_region_cleanup (state->cur_region);
this_state.cur_region = this_tf.region;
this_tf.try_finally_expr = tp;
this_tf.top_p = tp;
this_tf.outer = state;
! if (using_eh_for_cleanups_p () && !cleanup_is_dead_in (state->cur_region))
{
this_tf.region = gen_eh_region_cleanup (state->cur_region);
this_state.cur_region = this_tf.region;
===================================================================
*************** along with GCC; see the file COPYING3.
#include "df.h"
#include "params.h"
#include "target.h"
+ #include "tree-eh.h"
struct target_rtl default_target_rtl;
#if SWITCHABLE_TARGET
===================================================================
*************** along with GCC; see the file COPYING3.
#include "tree-ssa-alias.h"
#include "internal-fn.h"
#include "gimple-fold.h"
+ #include "tree-eh.h"
typedef gimple gimple_seq_node;