diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2012-02-12 22:54:22 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2012-02-12 22:54:22 +0000 |
commit | 710b2fbe5445a843bba2f0edca038b3c9252bc64 (patch) | |
tree | 8be8fe1e334bfe4255b44ee97fedce2c354b1429 /lib/Core/Executor.cpp | |
parent | 211c714dede4960774fb8b20a75289e5aa4bae79 (diff) | |
download | klee-710b2fbe5445a843bba2f0edca038b3c9252bc64.tar.gz |
Teach KLEE how to handle new ConstantDataSequential type.
Patch by arrowdodger! git-svn-id: https://llvm.org/svn/llvm-project/klee/trunk@150355 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Core/Executor.cpp')
-rw-r--r-- | lib/Core/Executor.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index e13cebb9..d9983493 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -399,6 +399,15 @@ void Executor::initializeGlobalObject(ExecutionState &state, ObjectState *os, for (unsigned i=0, e=cs->getNumOperands(); i != e; ++i) initializeGlobalObject(state, os, cs->getOperand(i), offset + sl->getElementOffset(i)); +#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 1) + } else if (const ConstantDataSequential *cds = + dyn_cast<ConstantDataSequential>(c)) { + unsigned elementSize = + targetData->getTypeStoreSize(cds->getElementType()); + for (unsigned i=0, e=cds->getNumElements(); i != e; ++i) + initializeGlobalObject(state, os, cds->getElementAsConstant(i), + offset + i*elementSize); +#endif } else { unsigned StoreBits = targetData->getTypeStoreSizeInBits(c->getType()); ref<ConstantExpr> C = evalConstant(c); @@ -945,6 +954,17 @@ ref<klee::ConstantExpr> Executor::evalConstant(const Constant *c) { return Expr::createPointer(0); } else if (isa<UndefValue>(c) || isa<ConstantAggregateZero>(c)) { return ConstantExpr::create(0, getWidthForLLVMType(c->getType())); +#if LLVM_VERSION_CODE >= LLVM_VERSION(3, 1) + } else if (const ConstantDataSequential *cds = + dyn_cast<ConstantDataSequential>(c)) { + std::vector<ref<Expr> > kids; + for (unsigned i = 0, e = cds->getNumElements(); i != e; ++i) { + ref<Expr> kid = evalConstant(cds->getElementAsConstant(i)); + kids.push_back(kid); + } + ref<Expr> res = ConcatExpr::createN(kids.size(), kids.data()); + return cast<ConstantExpr>(res); +#endif } else if (const ConstantStruct *cs = dyn_cast<ConstantStruct>(c)) { const StructLayout *sl = kmodule->targetData->getStructLayout(cs->getType()); llvm::SmallVector<ref<Expr>, 4> kids; |