зеркало из https://github.com/microsoft/clang-1.git
Move logic of GRExprEngine::EvalBinOp to SValuator::EvalBinOp.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80018 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
91cf4199cc
Коммит
ff4264dae3
|
@ -592,8 +592,10 @@ public:
|
|||
return R.isValid() ? SVator.EvalBinOpNN(op, L, cast<NonLoc>(R), T) : R;
|
||||
}
|
||||
|
||||
SVal EvalBinOp(const GRState *state, BinaryOperator::Opcode op,
|
||||
SVal lhs, SVal rhs, QualType T);
|
||||
SVal EvalBinOp(const GRState *ST, BinaryOperator::Opcode Op,
|
||||
SVal LHS, SVal RHS, QualType T) {
|
||||
return SVator.EvalBinOp(ST, Op, LHS, RHS, T);
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
|
|
|
@ -59,6 +59,9 @@ public:
|
|||
|
||||
virtual SVal EvalBinOpLN(const GRState *state, BinaryOperator::Opcode Op,
|
||||
Loc lhs, NonLoc rhs, QualType resultTy) = 0;
|
||||
|
||||
SVal EvalBinOp(const GRState *ST, BinaryOperator::Opcode Op,
|
||||
SVal L, SVal R, QualType T);
|
||||
};
|
||||
|
||||
SValuator* CreateSimpleSValuator(ValueManager &valMgr);
|
||||
|
|
|
@ -1354,9 +1354,11 @@ static bool EvalOSAtomicCompareAndSwap(ExplodedNodeSet& Dst,
|
|||
if (theValueVal.isUndef() || oldValueVal.isUndef()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
SValuator &SVator = Engine.getSValuator();
|
||||
|
||||
// Perform the comparison.
|
||||
SVal Cmp = Engine.EvalBinOp(stateLoad, BinaryOperator::EQ, theValueVal,
|
||||
SVal Cmp = SVator.EvalBinOp(stateLoad, BinaryOperator::EQ, theValueVal,
|
||||
oldValueVal, Engine.getContext().IntTy);
|
||||
|
||||
const GRState *stateEqual = stateLoad->assume(Cmp, true);
|
||||
|
@ -1370,9 +1372,8 @@ static bool EvalOSAtomicCompareAndSwap(ExplodedNodeSet& Dst,
|
|||
// Handle implicit value casts.
|
||||
if (const TypedRegion *R =
|
||||
dyn_cast_or_null<TypedRegion>(location.getAsRegion())) {
|
||||
llvm::tie(state, val) =
|
||||
Engine.getSValuator().EvalCast(val, state, R->getValueType(C),
|
||||
newValueExpr->getType());
|
||||
llvm::tie(state, val) = SVator.EvalCast(val, state, R->getValueType(C),
|
||||
newValueExpr->getType());
|
||||
}
|
||||
|
||||
Engine.EvalStore(TmpStore, theValueExpr, N, stateEqual, location,
|
||||
|
@ -3032,39 +3033,6 @@ void GRExprEngine::VisitBinaryOperator(BinaryOperator* B,
|
|||
}
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Transfer-function Helpers.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
SVal GRExprEngine::EvalBinOp(const GRState* state, BinaryOperator::Opcode Op,
|
||||
SVal L, SVal R, QualType T) {
|
||||
|
||||
if (L.isUndef() || R.isUndef())
|
||||
return UndefinedVal();
|
||||
|
||||
if (L.isUnknown() || R.isUnknown())
|
||||
return UnknownVal();
|
||||
|
||||
if (isa<Loc>(L)) {
|
||||
if (isa<Loc>(R))
|
||||
return SVator.EvalBinOpLL(Op, cast<Loc>(L), cast<Loc>(R), T);
|
||||
else
|
||||
return SVator.EvalBinOpLN(state, Op, cast<Loc>(L), cast<NonLoc>(R), T);
|
||||
}
|
||||
|
||||
if (isa<Loc>(R)) {
|
||||
// Support pointer arithmetic where the increment/decrement operand
|
||||
// is on the left and the pointer on the right.
|
||||
|
||||
assert (Op == BinaryOperator::Add || Op == BinaryOperator::Sub);
|
||||
|
||||
// Commute the operands.
|
||||
return SVator.EvalBinOpLN(state, Op, cast<Loc>(R), cast<NonLoc>(L), T);
|
||||
}
|
||||
else
|
||||
return SVator.EvalBinOpNN(Op, cast<NonLoc>(L), cast<NonLoc>(R), T);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Visualization.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -17,6 +17,35 @@
|
|||
|
||||
using namespace clang;
|
||||
|
||||
|
||||
SVal SValuator::EvalBinOp(const GRState *ST, BinaryOperator::Opcode Op,
|
||||
SVal L, SVal R, QualType T) {
|
||||
|
||||
if (L.isUndef() || R.isUndef())
|
||||
return UndefinedVal();
|
||||
|
||||
if (L.isUnknown() || R.isUnknown())
|
||||
return UnknownVal();
|
||||
|
||||
if (isa<Loc>(L)) {
|
||||
if (isa<Loc>(R))
|
||||
return EvalBinOpLL(Op, cast<Loc>(L), cast<Loc>(R), T);
|
||||
|
||||
return EvalBinOpLN(ST, Op, cast<Loc>(L), cast<NonLoc>(R), T);
|
||||
}
|
||||
|
||||
if (isa<Loc>(R)) {
|
||||
// Support pointer arithmetic where the increment/decrement operand
|
||||
// is on the left and the pointer on the right.
|
||||
assert(Op == BinaryOperator::Add || Op == BinaryOperator::Sub);
|
||||
|
||||
// Commute the operands.
|
||||
return EvalBinOpLN(ST, Op, cast<Loc>(R), cast<NonLoc>(L), T);
|
||||
}
|
||||
|
||||
return EvalBinOpNN(Op, cast<NonLoc>(L), cast<NonLoc>(R), T);
|
||||
}
|
||||
|
||||
SValuator::CastResult SValuator::EvalCast(SVal val, const GRState *state,
|
||||
QualType castTy, QualType originalTy){
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче