|
|
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.