aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-06-09 05:40:06 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-06-09 05:40:06 +0000
commit1b0dfab63d317509f7cbf4d4cc2643fc86e90e4d (patch)
tree201c0a8be926b662df36c052dd95a08e53e188e8
parent6b97844651c092af6ff525d82f4f15c04cd927dc (diff)
downloadklee-1b0dfab63d317509f7cbf4d4cc2643fc86e90e4d.tar.gz
Kill off UpdateList::isRooted flag.
- The right way to handle this is by using constant arrays, where the semantics are easier to define and implement. git-svn-id: https://llvm.org/svn/llvm-project/klee/trunk@73124 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/klee/Expr.h5
-rw-r--r--include/klee/util/Assignment.h2
-rw-r--r--lib/Core/Memory.cpp4
-rw-r--r--lib/Core/SeedInfo.cpp4
-rw-r--r--lib/Expr/Expr.cpp2
-rw-r--r--lib/Expr/ExprEvaluator.cpp3
-rw-r--r--lib/Expr/ExprPPrinter.cpp9
-rw-r--r--lib/Expr/ExprUtil.cpp5
-rw-r--r--lib/Expr/Parser.cpp17
-rw-r--r--lib/Expr/Updates.cpp10
-rw-r--r--lib/Solver/FastCexSolver.cpp10
-rw-r--r--lib/Solver/IndependentSolver.cpp22
-rw-r--r--lib/Solver/Solver.cpp3
13 files changed, 36 insertions, 60 deletions
diff --git a/include/klee/Expr.h b/include/klee/Expr.h
index d1fdfa73..e774eaff 100644
--- a/include/klee/Expr.h
+++ b/include/klee/Expr.h
@@ -507,11 +507,8 @@ public:
/// pointer to the most recent update node
const UpdateNode *head;
- // shouldn't this be part of the ReadExpr?
- bool isRooted;
-
public:
- UpdateList(const Array *_root, bool isRooted, const UpdateNode *_head);
+ UpdateList(const Array *_root, const UpdateNode *_head);
UpdateList(const UpdateList &b);
~UpdateList();
diff --git a/include/klee/util/Assignment.h b/include/klee/util/Assignment.h
index 051a84f9..458b8d8d 100644
--- a/include/klee/util/Assignment.h
+++ b/include/klee/util/Assignment.h
@@ -72,7 +72,7 @@ namespace klee {
return ConstantExpr::alloc(it->second[index], Expr::Int8);
} else {
if (allowFreeValues) {
- return ReadExpr::create(UpdateList(array, true, 0),
+ return ReadExpr::create(UpdateList(array, 0),
ConstantExpr::alloc(index, Expr::Int32));
} else {
return ConstantExpr::alloc(0, Expr::Int8);
diff --git a/lib/Core/Memory.cpp b/lib/Core/Memory.cpp
index 8f144456..ba1b8e1f 100644
--- a/lib/Core/Memory.cpp
+++ b/lib/Core/Memory.cpp
@@ -102,7 +102,7 @@ ObjectState::ObjectState(const MemoryObject *mo, unsigned _size)
flushMask(0),
knownSymbolics(0),
size(_size),
- updates(mo->array, false, 0),
+ updates(mo->array, 0),
readOnly(false) {
}
@@ -149,7 +149,6 @@ void ObjectState::makeConcrete() {
void ObjectState::makeSymbolic() {
assert(!updates.head &&
"XXX makeSymbolic of objects with symbolic values is unsupported");
- updates.isRooted = true;
// XXX simplify this, can just delete various arrays I guess
for (unsigned i=0; i<size; i++) {
@@ -792,7 +791,6 @@ void ObjectState::print() {
llvm::cerr << "-- ObjectState --\n";
llvm::cerr << "\tMemoryObject ID: " << object->id << "\n";
llvm::cerr << "\tRoot Object: " << updates.root << "\n";
- llvm::cerr << "\tIs Rooted? " << updates.isRooted << "\n";
llvm::cerr << "\tSize: " << size << "\n";
llvm::cerr << "\tBytes:\n";
diff --git a/lib/Core/SeedInfo.cpp b/lib/Core/SeedInfo.cpp
index 6fcfe596..dc3ff931 100644
--- a/lib/Core/SeedInfo.cpp
+++ b/lib/Core/SeedInfo.cpp
@@ -87,7 +87,7 @@ void SeedInfo::patchSeed(const ExecutionState &state,
it = directReads.begin(), ie = directReads.end(); it != ie; ++it) {
const Array *array = it->first;
unsigned i = it->second;
- ref<Expr> read = ReadExpr::create(UpdateList(array, true, 0),
+ ref<Expr> read = ReadExpr::create(UpdateList(array, 0),
ConstantExpr::alloc(i, Expr::Int32));
// If not in bindings then this can't be a violation?
@@ -124,7 +124,7 @@ void SeedInfo::patchSeed(const ExecutionState &state,
ie = assignment.bindings.end(); it != ie; ++it) {
const Array *array = it->first;
for (unsigned i=0; i<array->size; ++i) {
- ref<Expr> read = ReadExpr::create(UpdateList(array, true, 0),
+ ref<Expr> read = ReadExpr::create(UpdateList(array, 0),
ConstantExpr::alloc(i, Expr::Int32));
ref<Expr> isSeed = EqExpr::create(read, ConstantExpr::alloc(it->second[i], Expr::Int8));
bool res;
diff --git a/lib/Expr/Expr.cpp b/lib/Expr/Expr.cpp
index 57898969..3f5ef95f 100644
--- a/lib/Expr/Expr.cpp
+++ b/lib/Expr/Expr.cpp
@@ -38,7 +38,7 @@ namespace {
unsigned Expr::count = 0;
ref<Expr> Expr::createTempRead(const Array *array, Expr::Width w) {
- UpdateList ul(array, true, 0);
+ UpdateList ul(array, 0);
switch (w) {
default: assert(0 && "invalid width");
diff --git a/lib/Expr/ExprEvaluator.cpp b/lib/Expr/ExprEvaluator.cpp
index eced0e87..bf229731 100644
--- a/lib/Expr/ExprEvaluator.cpp
+++ b/lib/Expr/ExprEvaluator.cpp
@@ -24,8 +24,7 @@ ExprVisitor::Action ExprEvaluator::evalRead(const UpdateList &ul,
// cannot guarantee value. we can rewrite to read at this
// version though (mostly for debugging).
- UpdateList fwd(ul.root, un, 0);
- return Action::changeTo(ReadExpr::create(fwd,
+ return Action::changeTo(ReadExpr::create(UpdateList(ul.root, un),
ConstantExpr::alloc(index, Expr::Int32)));
}
}
diff --git a/lib/Expr/ExprPPrinter.cpp b/lib/Expr/ExprPPrinter.cpp
index 3fa7155b..831a4d91 100644
--- a/lib/Expr/ExprPPrinter.cpp
+++ b/lib/Expr/ExprPPrinter.cpp
@@ -167,11 +167,7 @@ private:
// Special case empty list.
if (!head) {
- if (updates.isRooted) {
- PC << "arr" << updates.root->id;
- } else {
- PC << "[]";
- }
+ PC << "arr" << updates.root->id;
return;
}
@@ -221,9 +217,6 @@ private:
if (openedList)
PC << ']';
- // FIXME: Figure out how isRooted should be dealt with in the language. The
- // old solution of using "anonymous" arrays is not a good idea.
-
PC << " @ arr" << updates.root->id;
}
diff --git a/lib/Expr/ExprUtil.cpp b/lib/Expr/ExprUtil.cpp
index 0c150a51..1213edeb 100644
--- a/lib/Expr/ExprUtil.cpp
+++ b/lib/Expr/ExprUtil.cpp
@@ -89,9 +89,8 @@ protected:
visit(un->value);
}
- if (ul.isRooted)
- if (results.insert(ul.root).second)
- objects.push_back(ul.root);
+ if (results.insert(ul.root).second)
+ objects.push_back(ul.root);
return Action::doChildren();
}
diff --git a/lib/Expr/Parser.cpp b/lib/Expr/Parser.cpp
index a2a5d2e2..496472bf 100644
--- a/lib/Expr/Parser.cpp
+++ b/lib/Expr/Parser.cpp
@@ -529,7 +529,7 @@ DeclResult ParserImpl::ParseArrayDecl() {
// Create the initial version reference.
VersionSymTab.insert(std::make_pair(Label,
- UpdateList(Root, true, NULL)));
+ UpdateList(Root, NULL)));
return AD;
}
@@ -577,8 +577,7 @@ DeclResult ParserImpl::ParseQueryCommand() {
for (std::map<const Identifier*, const ArrayDecl*>::iterator
it = ArraySymTab.begin(), ie = ArraySymTab.end(); it != ie; ++it) {
VersionSymTab.insert(std::make_pair(it->second->Name,
- UpdateList(it->second->Root,
- true, NULL)));
+ UpdateList(it->second->Root, NULL)));
}
@@ -1284,8 +1283,7 @@ VersionResult ParserImpl::ParseVersionSpecifier() {
if (it == VersionSymTab.end()) {
Error("invalid version reference.", LTok);
- return VersionResult(false,
- UpdateList(0, true, NULL));
+ return VersionResult(false, UpdateList(0, NULL));
}
return it->second;
@@ -1302,8 +1300,7 @@ VersionResult ParserImpl::ParseVersionSpecifier() {
VersionResult Res = ParseVersion();
// Define update list to avoid use-of-undef errors.
if (!Res.isValid()) {
- Res = VersionResult(true,
- UpdateList(new Array(0, -1, 0), true, NULL));
+ Res = VersionResult(true, UpdateList(new Array(0, -1, 0), NULL));
}
if (Label)
@@ -1332,7 +1329,7 @@ namespace {
/// update-list - lhs '=' rhs [',' update-list]
VersionResult ParserImpl::ParseVersion() {
if (Tok.kind != Token::LSquare)
- return VersionResult(false, UpdateList(0, false, NULL));
+ return VersionResult(false, UpdateList(0, NULL));
std::vector<WriteInfo> Writes;
ConsumeLSquare();
@@ -1358,11 +1355,11 @@ VersionResult ParserImpl::ParseVersion() {
}
ExpectRSquare("expected close of update list");
- VersionHandle Base(0, false, NULL);
+ VersionHandle Base(0, NULL);
if (Tok.kind != Token::At) {
Error("expected '@'.", Tok);
- return VersionResult(false, UpdateList(0, true, NULL));
+ return VersionResult(false, UpdateList(0, NULL));
}
ConsumeExpectedToken(Token::At);
diff --git a/lib/Expr/Updates.cpp b/lib/Expr/Updates.cpp
index 7c3f41d4..22544820 100644
--- a/lib/Expr/Updates.cpp
+++ b/lib/Expr/Updates.cpp
@@ -56,18 +56,15 @@ unsigned UpdateNode::computeHash() {
///
-UpdateList::UpdateList(const Array *_root, bool _isRooted,
- const UpdateNode *_head)
+UpdateList::UpdateList(const Array *_root, const UpdateNode *_head)
: root(_root),
- head(_head),
- isRooted(_isRooted) {
+ head(_head) {
if (head) ++head->refCount;
}
UpdateList::UpdateList(const UpdateList &b)
: root(b.root),
- head(b.head),
- isRooted(b.isRooted) {
+ head(b.head) {
if (head) ++head->refCount;
}
@@ -87,7 +84,6 @@ UpdateList &UpdateList::operator=(const UpdateList &b) {
if (head && --head->refCount==0) delete head;
root = b.root;
head = b.head;
- isRooted = b.isRooted;
return *this;
}
diff --git a/lib/Solver/FastCexSolver.cpp b/lib/Solver/FastCexSolver.cpp
index ea5427e3..1d06ca33 100644
--- a/lib/Solver/FastCexSolver.cpp
+++ b/lib/Solver/FastCexSolver.cpp
@@ -352,7 +352,7 @@ protected:
// If the index is out of range, we cannot assign it a value, since that
// value cannot be part of the assignment.
if (index >= array.size)
- return ReadExpr::create(UpdateList(&array, true, 0),
+ return ReadExpr::create(UpdateList(&array, 0),
ConstantExpr::alloc(index, Expr::Int32));
std::map<unsigned, CexObjectData*>::iterator it = objects.find(array.id);
@@ -373,17 +373,17 @@ protected:
// If the index is out of range, we cannot assign it a value, since that
// value cannot be part of the assignment.
if (index >= array.size)
- return ReadExpr::create(UpdateList(&array, true, 0),
+ return ReadExpr::create(UpdateList(&array, 0),
ConstantExpr::alloc(index, Expr::Int32));
std::map<unsigned, CexObjectData*>::iterator it = objects.find(array.id);
if (it == objects.end())
- return ReadExpr::create(UpdateList(&array, true, 0),
+ return ReadExpr::create(UpdateList(&array, 0),
ConstantExpr::alloc(index, Expr::Int32));
CexValueData cvd = it->second->getExactValues(index);
if (!cvd.isFixed())
- return ReadExpr::create(UpdateList(&array, true, 0),
+ return ReadExpr::create(UpdateList(&array, 0),
ConstantExpr::alloc(index, Expr::Int32));
return ConstantExpr::alloc(cvd.min(), Expr::Int8);
@@ -1020,7 +1020,7 @@ FastCexSolver::computeInitialValues(const Query& query,
for (unsigned i=0; i < array->size; i++) {
ref<Expr> read =
- ReadExpr::create(UpdateList(array, true, 0),
+ ReadExpr::create(UpdateList(array, 0),
ConstantExpr::create(i, kMachinePointerType));
ref<Expr> value = cd.evaluatePossible(read);
diff --git a/lib/Solver/IndependentSolver.cpp b/lib/Solver/IndependentSolver.cpp
index 455e9240..7ebee1c7 100644
--- a/lib/Solver/IndependentSolver.cpp
+++ b/lib/Solver/IndependentSolver.cpp
@@ -94,18 +94,16 @@ public:
findReads(e, /* visitUpdates= */ true, reads);
for (unsigned i = 0; i != reads.size(); ++i) {
ReadExpr *re = reads[i].get();
- if (re->updates.isRooted) {
- const Array *array = re->updates.root;
- if (!wholeObjects.count(array)) {
- if (ConstantExpr *CE = dyn_cast<ConstantExpr>(re->index)) {
- DenseSet<unsigned> &dis = elements[array];
- dis.add((unsigned) CE->getConstantValue());
- } else {
- elements_ty::iterator it2 = elements.find(array);
- if (it2!=elements.end())
- elements.erase(it2);
- wholeObjects.insert(array);
- }
+ const Array *array = re->updates.root;
+ if (!wholeObjects.count(array)) {
+ if (ConstantExpr *CE = dyn_cast<ConstantExpr>(re->index)) {
+ DenseSet<unsigned> &dis = elements[array];
+ dis.add((unsigned) CE->getConstantValue());
+ } else {
+ elements_ty::iterator it2 = elements.find(array);
+ if (it2!=elements.end())
+ elements.erase(it2);
+ wholeObjects.insert(array);
}
}
}
diff --git a/lib/Solver/Solver.cpp b/lib/Solver/Solver.cpp
index 98dcad0b..71516c24 100644
--- a/lib/Solver/Solver.cpp
+++ b/lib/Solver/Solver.cpp
@@ -343,8 +343,7 @@ ValidatingSolver::computeInitialValues(const Query& query,
const Array *array = objects[i];
for (unsigned j=0; j<array->size; j++) {
unsigned char value = values[i][j];
- bindings.push_back(EqExpr::create(ReadExpr::create(UpdateList(array,
- true, 0),
+ bindings.push_back(EqExpr::create(ReadExpr::create(UpdateList(array, 0),
ConstantExpr::alloc(j, Expr::Int32)),
ConstantExpr::alloc(value, Expr::Int8)));
}