aboutsummaryrefslogtreecommitdiffhomepage
path: root/lib
diff options
context:
space:
mode:
authorDan Liew <delcypher@gmail.com>2014-04-24 12:12:22 +0100
committerDan Liew <delcypher@gmail.com>2014-04-24 12:12:22 +0100
commit292e8cc794f01df94ca02279f5833d7a460a62f9 (patch)
tree80400e7fa9b69edd1ecdb3600ca88244f533c389 /lib
parent7f44b9346356c91f633c6de6939c33a45756ae7e (diff)
parent2795655e567c3cdbfe3d4815edd83b4f4cdbb542 (diff)
downloadklee-292e8cc794f01df94ca02279f5833d7a460a62f9.tar.gz
Merge pull request #112 from hpalikareva/domain-range-extra
Removing a few more hard-coded values for domains and ranges of Array ob...
Diffstat (limited to 'lib')
-rw-r--r--lib/Expr/Updates.cpp10
-rw-r--r--lib/Solver/FastCexSolver.cpp15
-rw-r--r--lib/Solver/Solver.cpp5
3 files changed, 21 insertions, 9 deletions
diff --git a/lib/Expr/Updates.cpp b/lib/Expr/Updates.cpp
index 14fd8308..bf7049ba 100644
--- a/lib/Expr/Updates.cpp
+++ b/lib/Expr/Updates.cpp
@@ -22,8 +22,12 @@ UpdateNode::UpdateNode(const UpdateNode *_next,
next(_next),
index(_index),
value(_value) {
+ // FIXME: What we need to check here instead is that _value is of the same width
+ // as the range of the array that the update node is part of.
+ /*
assert(_value->getWidth() == Expr::Int8 &&
"Update value should be 8-bit wide.");
+ */
computeHash();
if (next) {
++next->refCount;
@@ -84,6 +88,12 @@ UpdateList &UpdateList::operator=(const UpdateList &b) {
}
void UpdateList::extend(const ref<Expr> &index, const ref<Expr> &value) {
+
+ if (root) {
+ assert(root->getDomain() == index->getWidth());
+ assert(root->getRange() == value->getWidth());
+ }
+
if (head) --head->refCount;
head = new UpdateNode(head, index, value);
++head->refCount;
diff --git a/lib/Solver/FastCexSolver.cpp b/lib/Solver/FastCexSolver.cpp
index 08a9ef7c..6e52dc32 100644
--- a/lib/Solver/FastCexSolver.cpp
+++ b/lib/Solver/FastCexSolver.cpp
@@ -363,12 +363,12 @@ protected:
// value cannot be part of the assignment.
if (index >= array.size)
return ReadExpr::create(UpdateList(&array, 0),
- ConstantExpr::alloc(index, Expr::Int32));
+ ConstantExpr::alloc(index, array.getDomain()));
std::map<const Array*, CexObjectData*>::iterator it = objects.find(&array);
return ConstantExpr::alloc((it == objects.end() ? 127 :
it->second->getPossibleValue(index)),
- Expr::Int8);
+ array.getRange());
}
public:
@@ -384,19 +384,19 @@ protected:
// value cannot be part of the assignment.
if (index >= array.size)
return ReadExpr::create(UpdateList(&array, 0),
- ConstantExpr::alloc(index, Expr::Int32));
+ ConstantExpr::alloc(index, array.getDomain()));
std::map<const Array*, CexObjectData*>::iterator it = objects.find(&array);
if (it == objects.end())
return ReadExpr::create(UpdateList(&array, 0),
- ConstantExpr::alloc(index, Expr::Int32));
+ ConstantExpr::alloc(index, array.getDomain()));
CexValueData cvd = it->second->getExactValues(index);
if (!cvd.isFixed())
return ReadExpr::create(UpdateList(&array, 0),
- ConstantExpr::alloc(index, Expr::Int32));
+ ConstantExpr::alloc(index, array.getDomain()));
- return ConstantExpr::alloc(cvd.min(), Expr::Int8);
+ return ConstantExpr::alloc(cvd.min(), array.getRange());
}
public:
@@ -1109,13 +1109,14 @@ FastCexSolver::computeInitialValues(const Query& query,
// Propogation found a satisfying assignment, compute the initial values.
for (unsigned i = 0; i != objects.size(); ++i) {
const Array *array = objects[i];
+ assert(array);
std::vector<unsigned char> data;
data.reserve(array->size);
for (unsigned i=0; i < array->size; i++) {
ref<Expr> read =
ReadExpr::create(UpdateList(array, 0),
- ConstantExpr::create(i, Expr::Int32));
+ ConstantExpr::create(i, array->getDomain()));
ref<Expr> value = cd.evaluatePossible(read);
if (ConstantExpr *CE = dyn_cast<ConstantExpr>(value)) {
diff --git a/lib/Solver/Solver.cpp b/lib/Solver/Solver.cpp
index 22b1545f..c61b6b1c 100644
--- a/lib/Solver/Solver.cpp
+++ b/lib/Solver/Solver.cpp
@@ -407,11 +407,12 @@ ValidatingSolver::computeInitialValues(const Query& query,
std::vector< ref<Expr> > bindings;
for (unsigned i = 0; i != values.size(); ++i) {
const Array *array = objects[i];
+ assert(array);
for (unsigned j=0; j<array->size; j++) {
unsigned char value = values[i][j];
bindings.push_back(EqExpr::create(ReadExpr::create(UpdateList(array, 0),
- ConstantExpr::alloc(j, Expr::Int32)),
- ConstantExpr::alloc(value, Expr::Int8)));
+ ConstantExpr::alloc(j, array->getDomain())),
+ ConstantExpr::alloc(value, array->getRange())));
}
}
ConstraintManager tmp(bindings);