|
|
1.1 ! root 1: /* ! 2: * Code flow analysis. ! 3: */ ! 4: ! 5: /* ! 6: * A flow set for an expression defines three sets of pure variables. ! 7: * ! 8: * cut - those whose lifetime must be cut within the expression ! 9: * by a pure assignment ! 10: * mod - those which must be modified by the expression ! 11: * ref - those which may be referenced by the expression ! 12: * the expression must be able to use the value of ! 13: * the variable as it is at the beginning of the expression ! 14: * hide - possible read after last write ! 15: * cmod - might be modified ! 16: */ ! 17: typedef struct ! 18: { ! 19: xnode *f_cut; ! 20: xnode *f_mod; ! 21: xnode *f_ref; ! 22: xnode *f_hide; ! 23: xnode *f_cmod; ! 24: } ! 25: flow_set; ! 26: ! 27: #define is_pure(d) (((d)->id_value.i & PURE) != 0) ! 28: ! 29: #define make_set(p, id) (\ ! 30: (*(p)) = new_xnode(),\ ! 31: (*(p))->x_left = NULL,\ ! 32: (*(p))->x_value.d = (id)\ ! 33: ) ! 34: ! 35: #define pure_var(p) (\ ! 36: (p)->x_what == xt_dot\ ! 37: &&\ ! 38: (p)->x_left != NULL\ ! 39: &&\ ! 40: (p)->x_left->x_what == xt_name\ ! 41: &&\ ! 42: is_pure((p)->x_left->x_value.d)\ ! 43: ) ! 44: ! 45: /* ! 46: * Life time defines. ! 47: */ ! 48: #define L_NONE 0 ! 49: #define L_ACTIVE 1 ! 50: #define L_EQUIV 2 ! 51: #define L_DEAD -1 ! 52: #define L_HEAD -2 ! 53: ! 54: #define L_ORD(i) (-1 - (i)) ! 55: ! 56: /* ! 57: * Equivalence path definition values. ! 58: */ ! 59: #define E_NONE 0 ! 60: #define E_SOME 1 ! 61: #define E_ALL 2 ! 62: #define E_SUSP 3 ! 63: ! 64: extern ident *alloced_ids; ! 65: extern int eord; ! 66: extern char *equiv_value; ! 67: extern int equiv_max; ! 68: extern int trace_argument; ! 69: extern cnset expressions; ! 70: extern cnset mip_dead_ends; ! 71: extern xnode *err_set; ! 72: extern xnode *eq_set; ! 73: extern xnode *merr_set; ! 74: ! 75: extern int flow_flags(); ! 76: extern int is_member(); ! 77: extern xnode *copy_xlist(); ! 78: extern xnode *flow_diff(); ! 79: extern xnode *flow_inter(); ! 80: extern xnode *flow_pack(); ! 81: extern xnode *flow_union(); ! 82: extern void add_element(); ! 83: extern void alloc_ids(); ! 84: extern void equiv_init(); ! 85: extern void eval_check(); ! 86: extern void expr_flow(); ! 87: extern void free_xlist(); ! 88: extern void life_list(); ! 89: extern void make_pure(); ! 90: extern void mod_check(); ! 91: extern void print_errs(); ! 92: extern void print_list(); ! 93: extern void print_set(); ! 94: extern void sync_back(); ! 95: extern void trace_back(); ! 96: extern void trace_life(); ! 97: ! 98: #define E_ROUND(i) (((i) & ~0xF) + 0x10)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.