/* Generic dominator tree walker
- Copyright (C) 2003, 2004 Free Software Foundation, Inc.
+ Copyright (C) 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
Contributed by Diego Novillo <dnovillo@redhat.com>
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 2, or (at your option)
+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,
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 COPYING. If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
+along with GCC; see the file COPYING3. If not see
+<http://www.gnu.org/licenses/>. */
+
+typedef void *void_p;
+DEF_VEC_P(void_p);
+DEF_VEC_ALLOC_P(void_p,heap);
/* This is the main data structure for the dominator walker. It provides
the callback hooks as well as a convenient place to hang block local
struct dom_walk_data
{
- /* This is the direction of the dominator tree we want to walk. ie,
+ /* This is the direction of the dominator tree we want to walk. i.e.,
if it is set to CDI_DOMINATORS, then we walk the dominator tree,
if it is set to CDI_POST_DOMINATORS, then we walk the post
dominator tree. */
/* Function to call before the statement walk occurring before the
recursive walk of the dominator children.
- This typically initializes an block local data and pushes that
+ This typically initializes a block local data and pushes that
data onto BLOCK_DATA_STACK. */
void (*before_dom_children_before_stmts) (struct dom_walk_data *,
basic_block);
/* Stack of any data we need to keep on a per-block basis.
If you have no local data, then BLOCK_DATA_STACK will be NULL. */
- varray_type block_data_stack;
+ VEC(void_p,heap) *block_data_stack;
/* Size of the block local data. If this is zero, then it is assumed
you have no local data and thus no BLOCK_DATA_STACK as well. */
/* From here below are private data. Please do not use this
information/data outside domwalk.c. */
- /* Stack of available block local structures. */
- varray_type free_block_data;
+ /* Stack of available block local structures. */
+ VEC(void_p,heap) *free_block_data;
+
+ /* Interesting blocks to process. If this field is not NULL, this
+ set is used to determine which blocks to walk. If we encounter
+ block I in the dominator traversal, but block I is not present in
+ INTERESTING_BLOCKS, then none of the callback functions are
+ invoked on it. This is useful when a particular traversal wants
+ to filter out non-interesting blocks from the dominator tree. */
+ sbitmap interesting_blocks;
};
void walk_dominator_tree (struct dom_walk_data *, basic_block);