1+ // ===-- AlphaBuilder.cpp ---------------------------------*- C++ -*-===//
2+ //
3+ // The KLEE Symbolic Virtual Machine
4+ //
5+ // This file is distributed under the University of Illinois Open Source
6+ // License. See LICENSE.TXT for details.
7+ //
8+ // ===----------------------------------------------------------------------===//
9+
10+ #include " klee/Expr/AlphaBuilder.h"
11+ #include " klee/Expr/ArrayCache.h"
12+ #include " klee/Expr/SourceBuilder.h"
13+
14+ #include < vector>
15+
16+ namespace klee {
17+
18+ const Array *AlphaBuilder::visitArray (const Array *arr) {
19+ if (alphaArrayMap.find (arr) == alphaArrayMap.end ()) {
20+ ref<SymbolicSource> source = arr->source ;
21+ ref<Expr> size = visit (arr->getSize ());
22+
23+ if (!arr->isConstantArray ()) {
24+ source = SourceBuilder::alpha (index);
25+ index++;
26+ alphaArrayMap[arr] = arrayCache.CreateArray (
27+ size, source, arr->getDomain (), arr->getRange ());
28+ reverseAlphaArrayMap[alphaArrayMap[arr]] = arr;
29+ } else if (size != arr->getSize ()) {
30+ alphaArrayMap[arr] = arrayCache.CreateArray (
31+ size, source, arr->getDomain (), arr->getRange ());
32+ reverseAlphaArrayMap[alphaArrayMap[arr]] = arr;
33+ } else {
34+ alphaArrayMap[arr] = arr;
35+ reverseAlphaArrayMap[arr] = arr;
36+ }
37+ }
38+ return alphaArrayMap[arr];
39+ }
40+
41+ UpdateList AlphaBuilder::visitUpdateList (UpdateList u) {
42+ const Array *root = visitArray (u.root );
43+ std::vector<ref<UpdateNode>> updates;
44+
45+ for (auto un = u.head ; un; un = un->next ) {
46+ updates.push_back (un);
47+ }
48+
49+ updates.push_back (nullptr );
50+
51+ for (int i = updates.size () - 2 ; i >= 0 ; i--) {
52+ ref<Expr> index = visit (updates[i]->index );
53+ ref<Expr> value = visit (updates[i]->value );
54+ updates[i] = new UpdateNode (updates[i + 1 ], index, value);
55+ }
56+ return UpdateList (root, updates[0 ]);
57+ }
58+
59+ ExprVisitor::Action AlphaBuilder::visitRead (const ReadExpr &re) {
60+ ref<Expr> v = visit (re.index );
61+ UpdateList u = visitUpdateList (re.updates );
62+ ref<Expr> e = ReadExpr::create (u, v);
63+ return Action::changeTo (e);
64+ }
65+
66+ AlphaBuilder::AlphaBuilder (ArrayCache &_arrayCache) : arrayCache(_arrayCache) {}
67+
68+ constraints_ty AlphaBuilder::visitConstraints (constraints_ty cs) {
69+ constraints_ty result;
70+ for (auto arg : cs) {
71+ ref<Expr> v = visit (arg);
72+ reverseExprMap[v] = arg;
73+ reverseExprMap[Expr::createIsZero (v)] = Expr::createIsZero (arg);
74+ result.insert (v);
75+ }
76+ return result;
77+ }
78+ ref<Expr> AlphaBuilder::visitExpr (ref<Expr> v) {
79+ ref<Expr> e = visit (v);
80+ reverseExprMap[e] = v;
81+ reverseExprMap[Expr::createIsZero (e)] = Expr::createIsZero (v);
82+ return e;
83+ }
84+
85+ } // namespace klee
0 commit comments