diff options
author | lauras <lauras@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-09-05 15:50:41 +0000 |
---|---|---|
committer | lauras <lauras@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-09-05 15:50:41 +0000 |
commit | 4527a0e8e1291f9906d009893a42b5c8fcf861e7 (patch) | |
tree | 337c3e012e679db345f78cd2066a7fc4cd399987 /gcc/stmt.c | |
parent | 31a6f5515208689d806ba079788206ab7558eb9e (diff) | |
download | gcc-4527a0e8e1291f9906d009893a42b5c8fcf861e7.tar.gz |
2007-09-05 Laurynas Biveinis <laurynas.biveinis@gmail.com>
* Makefile.in (stmt.o): Add alloc-pool.h dependency.
* stmt.c: Include alloc-pool.h.
(struct case_node): Remove GTY marker.
(add_case_node): New parameter case_node_pool. Use it for
allocation of r.
(expand_case): New allocation pool case_node_pool. Initialize it,
pass to add_case_node and free it.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@128139 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/stmt.c')
-rw-r--r-- | gcc/stmt.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/gcc/stmt.c b/gcc/stmt.c index 7192dcaf291..69cb5e0b860 100644 --- a/gcc/stmt.c +++ b/gcc/stmt.c @@ -49,6 +49,7 @@ along with GCC; see the file COPYING3. If not see #include "optabs.h" #include "target.h" #include "regs.h" +#include "alloc-pool.h" /* Functions and data structures for expanding case statements. */ @@ -79,7 +80,7 @@ along with GCC; see the file COPYING3. If not see For very small, suitable switch statements, we can generate a series of simple bit test and branches instead. */ -struct case_node GTY(()) +struct case_node { struct case_node *left; /* Left son in binary tree */ struct case_node *right; /* Right son in binary tree; also node chain */ @@ -121,7 +122,7 @@ static int node_has_high_bound (case_node_ptr, tree); static int node_is_bounded (case_node_ptr, tree); static void emit_case_nodes (rtx, case_node_ptr, rtx, tree); static struct case_node *add_case_node (struct case_node *, tree, - tree, tree, tree); + tree, tree, tree, alloc_pool); /* Return the rtx-label that corresponds to a LABEL_DECL, @@ -2067,7 +2068,7 @@ expand_anon_union_decl (tree decl, tree cleanup ATTRIBUTE_UNUSED, static struct case_node * add_case_node (struct case_node *head, tree type, tree low, tree high, - tree label) + tree label, alloc_pool case_node_pool) { tree min_value, max_value; struct case_node *r; @@ -2119,7 +2120,7 @@ add_case_node (struct case_node *head, tree type, tree low, tree high, /* Add this label to the chain. Make sure to drop overflow flags. */ - r = ggc_alloc (sizeof (struct case_node)); + r = (struct case_node *) pool_alloc (case_node_pool); r->low = build_int_cst_wide (TREE_TYPE (low), TREE_INT_CST_LOW (low), TREE_INT_CST_HIGH (low)); r->high = build_int_cst_wide (TREE_TYPE (high), TREE_INT_CST_LOW (high), @@ -2322,6 +2323,10 @@ expand_case (tree exp) /* Label to jump to if no case matches. */ tree default_label_decl; + alloc_pool case_node_pool = create_alloc_pool ("struct case_node pool", + sizeof (struct case_node), + 100); + /* The switch body is lowered in gimplify.c, we should never have switches with a non-NULL SWITCH_BODY here. */ gcc_assert (!SWITCH_BODY (exp)); @@ -2359,7 +2364,7 @@ expand_case (tree exp) continue; case_list = add_case_node (case_list, index_type, low, high, - CASE_LABEL (elt)); + CASE_LABEL (elt), case_node_pool); } @@ -2410,6 +2415,7 @@ expand_case (tree exp) if (count == 0) { emit_jump (default_label); + free_alloc_pool (case_node_pool); return; } @@ -2580,6 +2586,7 @@ expand_case (tree exp) } free_temp_slots (); + free_alloc_pool (case_node_pool); } /* Generate code to jump to LABEL if OP0 and OP1 are equal in mode MODE. */ |