From c77b0052785a7ead9cb80a37a53de2229e2f0726 Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Tue, 25 Jul 2017 10:02:59 +0100 Subject: This commit simply moves evalConstant to ExecutorUtil (where evalConstantExpr also resides), as suggested by an old comment. --- lib/Core/Executor.cpp | 69 --------------------------------------------------- 1 file changed, 69 deletions(-) (limited to 'lib/Core/Executor.cpp') diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index 5560a3e5..dd4c8f47 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -1011,75 +1011,6 @@ void Executor::addConstraint(ExecutionState &state, ref condition) { ConstantExpr::alloc(1, Expr::Bool)); } -ref Executor::evalConstant(const Constant *c) { - if (const llvm::ConstantExpr *ce = dyn_cast(c)) { - return evalConstantExpr(ce); - } else { - if (const ConstantInt *ci = dyn_cast(c)) { - return ConstantExpr::alloc(ci->getValue()); - } else if (const ConstantFP *cf = dyn_cast(c)) { - return ConstantExpr::alloc(cf->getValueAPF().bitcastToAPInt()); - } else if (const GlobalValue *gv = dyn_cast(c)) { - return globalAddresses.find(gv)->second; - } else if (isa(c)) { - return Expr::createPointer(0); - } else if (isa(c) || isa(c)) { - return ConstantExpr::create(0, getWidthForLLVMType(c->getType())); - } else if (const ConstantDataSequential *cds = - dyn_cast(c)) { - std::vector > kids; - for (unsigned i = 0, e = cds->getNumElements(); i != e; ++i) { - ref kid = evalConstant(cds->getElementAsConstant(i)); - kids.push_back(kid); - } - ref res = ConcatExpr::createN(kids.size(), kids.data()); - return cast(res); - } 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 if (const ConstantArray *ca = dyn_cast(c)){ - llvm::SmallVector, 4> kids; - for (unsigned i = ca->getNumOperands(); i != 0; --i) { - unsigned op = i-1; - ref kid = evalConstant(ca->getOperand(op)); - kids.push_back(kid); - } - ref res = ConcatExpr::createN(kids.size(), kids.data()); - return cast(res); - } else if (const ConstantVector *cv = dyn_cast(c)) { - llvm::SmallVector, 8> kids; - const size_t numOperands = cv->getNumOperands(); - kids.reserve(numOperands); - for (unsigned i = 0; i < numOperands; ++i) { - kids.push_back(evalConstant(cv->getOperand(i))); - } - ref res = ConcatExpr::createN(numOperands, kids.data()); - assert(isa(res) && - "result of constant vector built is not a constant"); - return cast(res); - } else { - llvm::report_fatal_error("invalid argument to evalConstant()"); - } - } -} - const Cell& Executor::eval(KInstruction *ki, unsigned index, ExecutionState &state) const { assert(index < ki->inst->getNumOperands()); -- cgit 1.4.1