@@ -67,6 +67,83 @@ ABSTRACT_OBJECT_TYPET vsd_configt::option_to_abstract_type(
6767 return selected->second ;
6868}
6969
70+ template <class abstract_object_classt , class context_classt >
71+ abstract_object_pointert initialize_context_abstract_object (
72+ const typet type,
73+ bool top,
74+ bool bottom,
75+ const exprt &e,
76+ const abstract_environmentt &environment,
77+ const namespacet &ns)
78+ {
79+ if (top || bottom)
80+ {
81+ return abstract_object_pointert (new context_classt (
82+ abstract_object_pointert (new abstract_object_classt (type, top, bottom)),
83+ type,
84+ top,
85+ bottom));
86+ }
87+ else
88+ {
89+ PRECONDITION (type == ns.follow (e.type ()));
90+ return abstract_object_pointert (new context_classt (
91+ abstract_object_pointert (new abstract_object_classt (e, environment, ns)),
92+ e,
93+ environment,
94+ ns));
95+ }
96+ }
97+
98+ // / Function: variable_sensitivity_object_factoryt::initialize_abstract_object
99+ // / Initialize the abstract object class and return it.
100+ // /
101+ // / \param type: the type of the variable
102+ // / \param top: whether the abstract object should be top in the
103+ // / two-value domain
104+ // / \param bottom: whether the abstract object should be bottom in the
105+ // / two-value domain
106+ // / \param e: if top and bottom are false this expression is used as the
107+ // / starting pointer for the abstract object
108+ // / \param environment: the current abstract environment
109+ // / \param ns: namespace, used when following the input type
110+ // /
111+ // / \return An abstract object of the appropriate type.
112+ // /
113+ template <class abstract_object_classt >
114+ abstract_object_pointert initialize_abstract_object (
115+ const typet type,
116+ bool top,
117+ bool bottom,
118+ const exprt &e,
119+ const abstract_environmentt &environment,
120+ const namespacet &ns,
121+ const vsd_configt &configuration)
122+ {
123+ if (configuration.context_tracking .data_dependency_context )
124+ return initialize_context_abstract_object<
125+ abstract_object_classt,
126+ data_dependency_contextt>(type, top, bottom, e, environment, ns);
127+ if (configuration.context_tracking .last_write_context )
128+ return initialize_context_abstract_object<
129+ abstract_object_classt,
130+ write_location_contextt>(type, top, bottom, e, environment, ns);
131+ else
132+ {
133+ if (top || bottom)
134+ {
135+ return abstract_object_pointert (
136+ new abstract_object_classt (type, top, bottom));
137+ }
138+ else
139+ {
140+ PRECONDITION (type == ns.follow (e.type ()));
141+ return abstract_object_pointert (
142+ new abstract_object_classt (e, environment, ns));
143+ }
144+ }
145+ }
146+
70147ABSTRACT_OBJECT_TYPET
71148variable_sensitivity_object_factoryt::get_abstract_object_type (const typet type)
72149{
@@ -128,48 +205,48 @@ variable_sensitivity_object_factoryt::get_abstract_object(
128205 {
129206 case CONSTANT:
130207 return initialize_abstract_object<constant_abstract_valuet>(
131- followed_type, top, bottom, e, environment, ns);
208+ followed_type, top, bottom, e, environment, ns, configuration );
132209 case INTERVAL:
133210 return initialize_abstract_object<interval_abstract_valuet>(
134- followed_type, top, bottom, e, environment, ns);
211+ followed_type, top, bottom, e, environment, ns, configuration );
135212 case ARRAY_SENSITIVE:
136213 return configuration.value_abstract_type == INTERVAL
137214 ? initialize_abstract_object<interval_array_abstract_objectt>(
138- followed_type, top, bottom, e, environment, ns)
215+ followed_type, top, bottom, e, environment, ns, configuration )
139216 : initialize_abstract_object<constant_array_abstract_objectt>(
140- followed_type, top, bottom, e, environment, ns);
217+ followed_type, top, bottom, e, environment, ns, configuration );
141218 case ARRAY_INSENSITIVE:
142219 return initialize_abstract_object<array_abstract_objectt>(
143- followed_type, top, bottom, e, environment, ns);
220+ followed_type, top, bottom, e, environment, ns, configuration );
144221 case POINTER_SENSITIVE:
145222 return initialize_abstract_object<constant_pointer_abstract_objectt>(
146- followed_type, top, bottom, e, environment, ns);
223+ followed_type, top, bottom, e, environment, ns, configuration );
147224 case POINTER_INSENSITIVE:
148225 return initialize_abstract_object<pointer_abstract_objectt>(
149- followed_type, top, bottom, e, environment, ns);
226+ followed_type, top, bottom, e, environment, ns, configuration );
150227 case STRUCT_SENSITIVE:
151228 return initialize_abstract_object<full_struct_abstract_objectt>(
152- followed_type, top, bottom, e, environment, ns);
229+ followed_type, top, bottom, e, environment, ns, configuration );
153230 case STRUCT_INSENSITIVE:
154231 return initialize_abstract_object<struct_abstract_objectt>(
155- followed_type, top, bottom, e, environment, ns);
232+ followed_type, top, bottom, e, environment, ns, configuration );
156233 case UNION_INSENSITIVE:
157234 return initialize_abstract_object<union_abstract_objectt>(
158- followed_type, top, bottom, e, environment, ns);
235+ followed_type, top, bottom, e, environment, ns, configuration );
159236 case TWO_VALUE:
160237 return initialize_abstract_object<abstract_objectt>(
161- followed_type, top, bottom, e, environment, ns);
238+ followed_type, top, bottom, e, environment, ns, configuration );
162239 case VALUE_SET:
163240 if (configuration.advanced_sensitivities .new_value_set )
164241 {
165242 return initialize_abstract_object<value_set_abstract_valuet>(
166- followed_type, top, bottom, e, environment, ns);
243+ followed_type, top, bottom, e, environment, ns, configuration );
167244 }
168245 return initialize_abstract_object<value_set_abstract_objectt>(
169- followed_type, top, bottom, e, environment, ns);
246+ followed_type, top, bottom, e, environment, ns, configuration );
170247 default :
171248 UNREACHABLE;
172249 return initialize_abstract_object<abstract_objectt>(
173- followed_type, top, bottom, e, environment, ns);
250+ followed_type, top, bottom, e, environment, ns, configuration );
174251 }
175252}
0 commit comments