X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fbasic-block.h;h=baca9d7e9e88f003d121e584d47f6326ebcdf358;hb=c5e839cb5ef14a22e8078adb0ede837f47d750a0;hp=fcaa9a952aa601177e970746ef6050972b2643bb;hpb=94ee50e822660c4a39e4f5e3e28b18a58adb9f10;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/basic-block.h b/gcc/basic-block.h index fcaa9a952aa..baca9d7e9e8 100644 --- a/gcc/basic-block.h +++ b/gcc/basic-block.h @@ -145,7 +145,8 @@ struct edge_def GTY(()) }; typedef struct edge_def *edge; -DEF_VEC_GC_P(edge); +DEF_VEC_P(edge); +DEF_VEC_ALLOC_P(edge,gc); #define EDGE_FALLTHRU 1 /* 'Straight line' flow */ #define EDGE_ABNORMAL 2 /* Strange flow, like computed @@ -220,8 +221,8 @@ struct basic_block_def GTY((chain_next ("%h.next_bb"), chain_prev ("%h.prev_bb") tree stmt_list; /* The edges into and out of the block. */ - VEC(edge) *preds; - VEC(edge) *succs; + VEC(edge,gc) *preds; + VEC(edge,gc) *succs; /* The registers that are live on entry to this block. */ bitmap GTY ((skip (""))) global_live_at_start; @@ -650,10 +651,10 @@ single_pred (basic_block bb) typedef struct { unsigned index; - VEC(edge) **container; + VEC(edge,gc) **container; } edge_iterator; -static inline VEC(edge) * +static inline VEC(edge,gc) * ei_container (edge_iterator i) { gcc_assert (i.container); @@ -665,7 +666,7 @@ ei_container (edge_iterator i) /* Return an iterator pointing to the start of an edge vector. */ static inline edge_iterator -ei_start_1 (VEC(edge) **ev) +ei_start_1 (VEC(edge,gc) **ev) { edge_iterator i; @@ -678,7 +679,7 @@ ei_start_1 (VEC(edge) **ev) /* Return an iterator pointing to the last element of an edge vector. */ static inline edge_iterator -ei_last_1 (VEC(edge) **ev) +ei_last_1 (VEC(edge,gc) **ev) { edge_iterator i; @@ -735,6 +736,25 @@ ei_safe_edge (edge_iterator i) return !ei_end_p (i) ? ei_edge (i) : NULL; } +/* Return 1 if we should continue to iterate. Return 0 otherwise. + *Edge P is set to the next edge if we are to continue to iterate + and NULL otherwise. */ + +static inline bool +ei_cond (edge_iterator ei, edge *p) +{ + if (!ei_end_p (ei)) + { + *p = ei_edge (ei); + return 1; + } + else + { + *p = NULL; + return 0; + } +} + /* This macro serves as a convenient way to iterate each edge in a vector of predecessor or successor edges. It must not be used when an element might be removed during the traversal, otherwise @@ -750,9 +770,9 @@ ei_safe_edge (edge_iterator i) } */ -#define FOR_EACH_EDGE(EDGE,ITER,EDGE_VEC) \ - for ((EDGE) = NULL, (ITER) = ei_start ((EDGE_VEC)); \ - ((EDGE) = ei_safe_edge ((ITER))); \ +#define FOR_EACH_EDGE(EDGE,ITER,EDGE_VEC) \ + for ((ITER) = ei_start ((EDGE_VEC)); \ + ei_cond ((ITER), &(EDGE)); \ ei_next (&(ITER))) struct edge_list * create_edge_list (void); @@ -780,9 +800,8 @@ enum update_life_extent #define PROP_ALLOW_CFG_CHANGES 32 /* Allow the CFG to be changed by dead code removal. */ #define PROP_AUTOINC 64 /* Create autoinc mem references. */ -#define PROP_EQUAL_NOTES 128 /* Take into account REG_EQUAL notes. */ -#define PROP_SCAN_DEAD_STORES 256 /* Scan for dead code. */ -#define PROP_ASM_SCAN 512 /* Internal flag used within flow.c +#define PROP_SCAN_DEAD_STORES 128 /* Scan for dead code. */ +#define PROP_ASM_SCAN 256 /* Internal flag used within flow.c to flag analysis of asms. */ #define PROP_FINAL (PROP_DEATH_NOTES | PROP_LOG_LINKS \ | PROP_REG_INFO | PROP_KILL_DEAD_CODE \