forked from OSchip/llvm-project
[analyzer][NFC] Inline loc::ConcreteInt::evalBinOp
This patch also refactored some of the enclosing parts. Reviewed By: martong Differential Revision: https://reviews.llvm.org/D126128
This commit is contained in:
parent
ee8987d585
commit
f6eab43764
|
@ -645,10 +645,6 @@ public:
|
|||
return *static_cast<const llvm::APSInt *>(Data);
|
||||
}
|
||||
|
||||
// Transfer functions for binary/unary operations on ConcreteInts.
|
||||
SVal evalBinOp(BasicValueFactory& BasicVals, BinaryOperator::Opcode Op,
|
||||
const ConcreteInt& R) const;
|
||||
|
||||
private:
|
||||
friend class SVal;
|
||||
|
||||
|
|
|
@ -298,23 +298,6 @@ nonloc::ConcreteInt::evalMinus(SValBuilder &svalBuilder) const {
|
|||
return svalBuilder.makeIntVal(-getValue());
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Transfer function dispatch for Locs.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
SVal loc::ConcreteInt::evalBinOp(BasicValueFactory& BasicVals,
|
||||
BinaryOperator::Opcode Op,
|
||||
const loc::ConcreteInt& R) const {
|
||||
assert(BinaryOperator::isComparisonOp(Op) || Op == BO_Sub);
|
||||
|
||||
const llvm::APSInt *X = BasicVals.evalAPSInt(Op, getValue(), R.getValue());
|
||||
|
||||
if (X)
|
||||
return nonloc::ConcreteInt(*X);
|
||||
else
|
||||
return UndefinedVal();
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Pretty-Printing.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -851,6 +851,8 @@ SVal SimpleSValBuilder::evalBinOpLL(ProgramStateRef state,
|
|||
return UnknownVal();
|
||||
|
||||
case loc::ConcreteIntKind: {
|
||||
auto L = lhs.castAs<loc::ConcreteInt>();
|
||||
|
||||
// If one of the operands is a symbol and the other is a constant,
|
||||
// build an expression for use by the constraint manager.
|
||||
if (SymbolRef rSym = rhs.getAsLocSymbol()) {
|
||||
|
@ -859,19 +861,17 @@ SVal SimpleSValBuilder::evalBinOpLL(ProgramStateRef state,
|
|||
if (!BinaryOperator::isComparisonOp(op) || op == BO_Cmp)
|
||||
return UnknownVal();
|
||||
|
||||
const llvm::APSInt &lVal = lhs.castAs<loc::ConcreteInt>().getValue();
|
||||
op = BinaryOperator::reverseComparisonOp(op);
|
||||
return makeNonLoc(rSym, op, lVal, resultTy);
|
||||
return makeNonLoc(rSym, op, L.getValue(), resultTy);
|
||||
}
|
||||
|
||||
// If both operands are constants, just perform the operation.
|
||||
if (Optional<loc::ConcreteInt> rInt = rhs.getAs<loc::ConcreteInt>()) {
|
||||
SVal ResultVal =
|
||||
lhs.castAs<loc::ConcreteInt>().evalBinOp(BasicVals, op, *rInt);
|
||||
if (Optional<NonLoc> Result = ResultVal.getAs<NonLoc>())
|
||||
return evalCast(*Result, resultTy, QualType{});
|
||||
assert(BinaryOperator::isComparisonOp(op) || op == BO_Sub);
|
||||
|
||||
assert(!ResultVal.getAs<Loc>() && "Loc-Loc ops should not produce Locs");
|
||||
if (const auto *ResultInt =
|
||||
BasicVals.evalAPSInt(op, L.getValue(), rInt->getValue()))
|
||||
return evalCast(nonloc::ConcreteInt(*ResultInt), resultTy, QualType{});
|
||||
return UnknownVal();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue