From 243a217c15fdbf920f91fabfae460f957b25e0ec Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Wed, 18 May 2011 21:49:12 +0000 Subject: Add ConstantStruct support to Executor::evalConstant git-svn-id: https://llvm.org/svn/llvm-project/klee/trunk@131586 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Core/Executor.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'lib/Core/Executor.cpp') diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index aa0b43d2..0dbaab80 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -945,8 +945,28 @@ ref Executor::evalConstant(Constant *c) { return Expr::createPointer(0); } else if (isa(c) || isa(c)) { return ConstantExpr::create(0, getWidthForLLVMType(c->getType())); + } else if (const ConstantStruct *cs = dyn_cast(c)) { + const StructLayout *sl = kmodule->targetData->getStructLayout(cs->getType()); + llvm::SmallVector, 4> kids; + for (unsigned i = cs->getNumOperands(); i != 0; --i) { + unsigned op = i-1; + ref kid = evalConstant(cs->getOperand(op)); + + uint64_t thisOffset = sl->getElementOffsetInBits(op), + nextOffset = (op == cs->getNumOperands() - 1) + ? sl->getSizeInBits() + : sl->getElementOffsetInBits(op+1); + if (nextOffset-thisOffset > kid->getWidth()) { + uint64_t paddingWidth = nextOffset-thisOffset-kid->getWidth(); + kids.push_back(ConstantExpr::create(0, paddingWidth)); + } + + kids.push_back(kid); + } + ref res = ConcatExpr::createN(kids.size(), kids.data()); + return cast(res); } else { - // Constant{Array,Struct,Vector} + // Constant{Array,Vector} assert(0 && "invalid argument to evalConstant()"); } } -- cgit 1.4.1