35 std::unordered_map<std::string, std::unordered_map<User*, std::unordered_set<User*>>> results_;
47 std::pair<std::unordered_set<User*>, std::unordered_map<User*, std::unordered_set<User*>>>>
50 std::list<std::unique_ptr<User>> undefined_users_;
53 std::unordered_map<std::string, bool> scalar_containers_;
55 bool is_scalar(
const std::string& container);
63 bool detailed_ =
false;
73 std::unique_ptr<AssumptionsAnalysis> detailed_assumptions_;
96 const std::unordered_map<
User*, std::unordered_set<User*>>* open_definitions
99 using Definitions = std::unordered_map<User*, std::unordered_set<User*>>;
101 using OpenDefinitions = std::unordered_map<std::string, Definitions>;
103 static OpenDefinitions group_by_container(
const Definitions&
definitions);
104 static Definitions flatten(
const OpenDefinitions&
definitions);
106 void visit_block_impl(
109 std::unordered_set<User*>& undefined,
110 OpenDefinitions& open_definitions,
111 Definitions& closed_definitions
113 void visit_assignment_block_impl(
116 std::unordered_set<User*>& undefined,
117 OpenDefinitions& open_definitions,
118 Definitions& closed_definitions
123 std::unordered_set<User*>& undefined,
124 OpenDefinitions& open_definitions,
125 Definitions& closed_definitions
127 void visit_if_else_impl(
130 std::unordered_set<User*>& undefined,
131 OpenDefinitions& open_definitions,
132 Definitions& closed_definitions
134 void visit_while_impl(
137 std::unordered_set<User*>& undefined,
138 OpenDefinitions& open_definitions,
139 Definitions& closed_definitions
141 void visit_return_impl(
144 std::unordered_set<User*>& undefined,
145 OpenDefinitions& open_definitions,
146 Definitions& closed_definitions
148 void visit_sequence_impl(
151 std::unordered_set<User*>& undefined,
152 OpenDefinitions& open_definitions,
153 Definitions& closed_definitions
167 detailed_ = detailed;
170 std::string
name()
const override {
171 return "DataDependencyAnalysis";
181 std::unordered_set<User*>& undefined,
182 std::unordered_map<
User*, std::unordered_set<User*>>& open_definitions,
183 std::unordered_map<
User*, std::unordered_set<User*>>& closed_definitions
189 std::unordered_set<User*>& undefined,
190 std::unordered_map<
User*, std::unordered_set<User*>>& open_definitions,
191 std::unordered_map<
User*, std::unordered_set<User*>>& closed_definitions
197 std::unordered_set<User*>& undefined,
198 std::unordered_map<
User*, std::unordered_set<User*>>& open_definitions,
199 std::unordered_map<
User*, std::unordered_set<User*>>& closed_definitions
205 std::unordered_set<User*>& undefined,
206 std::unordered_map<
User*, std::unordered_set<User*>>& open_definitions,
207 std::unordered_map<
User*, std::unordered_set<User*>>& closed_definitions
213 std::unordered_set<User*>& undefined,
214 std::unordered_map<
User*, std::unordered_set<User*>>& open_definitions,
215 std::unordered_map<
User*, std::unordered_set<User*>>& closed_definitions
221 std::unordered_set<User*>& undefined,
222 std::unordered_map<
User*, std::unordered_set<User*>>& open_definitions,
223 std::unordered_map<
User*, std::unordered_set<User*>>& closed_definitions
229 std::unordered_set<User*>& undefined,
230 std::unordered_map<
User*, std::unordered_set<User*>>& open_definitions,
231 std::unordered_map<
User*, std::unordered_set<User*>>& closed_definitions
250 std::unordered_map<User*, std::unordered_set<User*>>
definitions(
const std::string& container);
258 std::unordered_map<User*, std::unordered_set<User*>>
defined_by(
const std::string& container);
287 const std::unordered_map<User*, std::unordered_set<User*>>&