2 * smatch/smatch_dinfo.c
4 * Copyright (C) 2010 Dan Carpenter.
6 * Licensed under the Open Software License version 1.1
11 * smatch_dinfo.c has helper functions for handling data_info structs
22 #include "smatch_slist.h"
23 #include "smatch_extra.h"
25 struct data_info
*get_dinfo(struct smatch_state
*state
)
29 return (struct data_info
*)state
->data
;
32 struct range_list_sval
*estate_ranges_sval(struct smatch_state
*state
)
36 return get_dinfo(state
)->value_ranges
;
39 struct related_list
*estate_related(struct smatch_state
*state
)
43 return get_dinfo(state
)->related
;
46 sval_t
estate_min_sval(struct smatch_state
*state
)
48 return rl_min_sval(estate_ranges_sval(state
));
51 sval_t
estate_max_sval(struct smatch_state
*state
)
53 return rl_max_sval(estate_ranges_sval(state
));
56 struct symbol
*estate_type(struct smatch_state
*state
)
58 return rl_max_sval(estate_ranges_sval(state
)).type
;
61 static int rlists_equiv(struct related_list
*one
, struct related_list
*two
)
63 struct relation
*one_rel
;
64 struct relation
*two_rel
;
66 PREPARE_PTR_LIST(one
, one_rel
);
67 PREPARE_PTR_LIST(two
, two_rel
);
69 if (!one_rel
&& !two_rel
)
71 if (!one_rel
|| !two_rel
)
73 if (one_rel
->sym
!= two_rel
->sym
)
75 if (strcmp(one_rel
->name
, two_rel
->name
))
77 NEXT_PTR_LIST(one_rel
);
78 NEXT_PTR_LIST(two_rel
);
80 FINISH_PTR_LIST(two_rel
);
81 FINISH_PTR_LIST(one_rel
);
86 int estates_equiv(struct smatch_state
*one
, struct smatch_state
*two
)
90 if (!rlists_equiv(estate_related(one
), estate_related(two
)))
92 if (strcmp(one
->name
, two
->name
) == 0)
97 int estate_get_single_value_sval(struct smatch_state
*state
, sval_t
*sval
)
101 min
= rl_min_sval(estate_ranges_sval(state
));
102 max
= rl_max_sval(estate_ranges_sval(state
));
103 if (sval_cmp(min
, max
) != 0)
109 static struct data_info
*alloc_dinfo(void)
111 struct data_info
*ret
;
113 ret
= __alloc_data_info(0);
115 ret
->type
= DATA_RANGE
;
116 ret
->value_ranges
= NULL
;
120 static struct data_info
*alloc_dinfo_range(sval_t min
, sval_t max
)
122 struct data_info
*ret
;
125 add_range_sval(&ret
->value_ranges
, min
, max
);
129 static struct data_info
*alloc_dinfo_range_list(struct range_list_sval
*rl
)
131 struct data_info
*ret
;
134 ret
->value_ranges
= rl
;
138 static struct data_info
*clone_dinfo(struct data_info
*dinfo
)
140 struct data_info
*ret
;
143 ret
->related
= clone_related_list(dinfo
->related
);
144 ret
->value_ranges
= clone_range_list_sval(dinfo
->value_ranges
);
148 struct smatch_state
*clone_estate(struct smatch_state
*state
)
150 struct smatch_state
*ret
;
152 ret
= __alloc_smatch_state(0);
153 ret
->name
= state
->name
;
154 ret
->data
= clone_dinfo(get_dinfo(state
));
158 struct smatch_state
*alloc_estate_empty(void)
160 struct smatch_state
*state
;
161 struct data_info
*dinfo
;
163 dinfo
= alloc_dinfo();
164 state
= __alloc_smatch_state(0);
170 struct smatch_state
*extra_undefined(struct symbol
*type
)
172 return alloc_estate_range_list_sval(whole_range_list_sval(type
));
175 struct smatch_state
*extra_empty(void)
177 struct smatch_state
*ret
;
179 ret
= __alloc_smatch_state(0);
181 ret
->data
= alloc_dinfo();
185 struct smatch_state
*alloc_estate_sval(sval_t sval
)
187 struct smatch_state
*state
;
189 state
= __alloc_smatch_state(0);
190 state
->data
= alloc_dinfo_range(sval
, sval
);
191 state
->name
= show_ranges_sval(get_dinfo(state
)->value_ranges
);
195 struct smatch_state
*alloc_estate_range_sval(sval_t min
, sval_t max
)
197 struct smatch_state
*state
;
199 state
= __alloc_smatch_state(0);
200 state
->data
= alloc_dinfo_range(min
, max
);
201 state
->name
= show_ranges_sval(get_dinfo(state
)->value_ranges
);
205 struct smatch_state
*alloc_estate_range_list_sval(struct range_list_sval
*rl
)
207 struct smatch_state
*state
;
210 return extra_empty();
212 state
= __alloc_smatch_state(0);
213 state
->data
= alloc_dinfo_range_list(rl
);
214 state
->name
= show_ranges_sval(rl
);