diff options
author | Cristian Cadar <c.cadar@imperial.ac.uk> | 2015-03-02 18:06:41 +0000 |
---|---|---|
committer | Cristian Cadar <c.cadar@imperial.ac.uk> | 2015-03-02 18:06:41 +0000 |
commit | 05bc038a523180cb21fdd15e691dd96043e2e12d (patch) | |
tree | 6ba801b9e1aa4c24fd87fa830674881ffe7802e6 /lib/Expr/Expr.cpp | |
parent | 3bd3789c2009fc9976d6b2ab5d0cb716c3d35dc3 (diff) | |
parent | 1c10b2b52a4f91f62bc9ef632032d7f0ade0307c (diff) | |
download | klee-05bc038a523180cb21fdd15e691dd96043e2e12d.tar.gz |
Merge branch 'holycrap872-ArrayFactory'
Diffstat (limited to 'lib/Expr/Expr.cpp')
-rw-r--r-- | lib/Expr/Expr.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/lib/Expr/Expr.cpp b/lib/Expr/Expr.cpp index d54b8f4d..baa85663 100644 --- a/lib/Expr/Expr.cpp +++ b/lib/Expr/Expr.cpp @@ -490,10 +490,45 @@ unsigned Array::computeHash() { unsigned res = 0; for (unsigned i = 0, e = name.size(); i != e; ++i) res = (res * Expr::MAGIC_HASH_CONSTANT) + name[i]; + res = (res * Expr::MAGIC_HASH_CONSTANT) + size; hashValue = res; return hashValue; } +std::map<unsigned, std::vector<const Array *> *> Array::symbolicArraySingletonMap; + +const Array * Array::CreateArray(const std::string &_name, uint64_t _size, + const ref<ConstantExpr> *constantValuesBegin, + const ref<ConstantExpr> *constantValuesEnd, + Expr::Width _domain, + Expr::Width _range) { + + const Array * array = new Array(_name, _size, constantValuesBegin, constantValuesEnd, _domain,_range); + if (array->constantValues.size() == 0) { // symbolic array + unsigned hash = array->hash(); + std::vector<const Array *> * bucket = Array::symbolicArraySingletonMap[hash]; + if (bucket){ + for (std::vector<const Array*>::const_iterator it = bucket->begin(); + it != bucket->end(); it ++){ + const Array* prospect = *it; + if (prospect->size == array->size && prospect->name == array->name){ + delete array; + return prospect; + } + } + bucket->push_back(array); + return array; + } else { + bucket = new std::vector<const Array *>(); + bucket->push_back(array); + Array::symbolicArraySingletonMap[hash] = bucket; + return array; + } + } else { // concrete array + return array; + } +} + /***/ ref<Expr> ReadExpr::create(const UpdateList &ul, ref<Expr> index) { |