SVals.cpp revision 9012bff2ce5afc85936315662d675f2bcede1ca2
1a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//= RValues.cpp - Abstract RValues for Path-Sens. Value Tracking -*- C++ -*-==// 2a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// 3a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// The LLVM Compiler Infrastructure 4a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// 5a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// This file is distributed under the University of Illinois Open Source 6a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// License. See LICENSE.TXT for details. 7a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// 8a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//===----------------------------------------------------------------------===// 9a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// 101c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu// This file defines SVal, Loc, and NonLoc, classes that represent 11a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// abstract r-values for use with path-sensitive value tracking. 12a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// 13a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//===----------------------------------------------------------------------===// 14a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "clang/Analysis/PathSensitive/GRState.h" 16c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar#include "clang/Basic/IdentifierTable.h" 17d70d0b05e5143be9e952eceb5aad7914b2ecab97Ted Kremenek#include "llvm/Support/Streams.h" 18a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 19a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenekusing namespace clang; 20a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenekusing llvm::dyn_cast; 21a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenekusing llvm::cast; 22a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenekusing llvm::APSInt; 23a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 24a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//===----------------------------------------------------------------------===// 2590e1481ef15ec75e3503e0c6e5effad5bd639f01Ted Kremenek// Symbol Iteration. 2690e1481ef15ec75e3503e0c6e5effad5bd639f01Ted Kremenek//===----------------------------------------------------------------------===// 2790e1481ef15ec75e3503e0c6e5effad5bd639f01Ted Kremenek 281c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuSVal::symbol_iterator SVal::symbol_begin() const { 29718c4f7b3ff713c3ebee46553d687bde63e5666fTed Kremenek 30718c4f7b3ff713c3ebee46553d687bde63e5666fTed Kremenek // FIXME: This is a rat's nest. Cleanup. 31718c4f7b3ff713c3ebee46553d687bde63e5666fTed Kremenek 321c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu if (isa<loc::SymbolVal>(this)) 33aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek return (symbol_iterator) (&Data); 341c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu else if (isa<nonloc::SymbolVal>(this)) 35aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek return (symbol_iterator) (&Data); 361c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu else if (isa<nonloc::SymIntConstraintVal>(this)) { 37aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek const SymIntConstraint& C = 381c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu cast<nonloc::SymIntConstraintVal>(this)->getConstraint(); 39aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek 40aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek return (symbol_iterator) &C.getSymbol(); 4190e1481ef15ec75e3503e0c6e5effad5bd639f01Ted Kremenek } 421c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu else if (isa<nonloc::LocAsInteger>(this)) { 431c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu const nonloc::LocAsInteger& V = cast<nonloc::LocAsInteger>(*this); 441c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu return V.getPersistentLoc().symbol_begin(); 450fe33bc94a822e315585e5cde1964d3c3b9052f9Ted Kremenek } 46d9bc33efa195114d6f2a365c26e5b8dba4e1cc38Ted Kremenek 47d9bc33efa195114d6f2a365c26e5b8dba4e1cc38Ted Kremenek // FIXME: We need to iterate over the symbols of regions. 48d9bc33efa195114d6f2a365c26e5b8dba4e1cc38Ted Kremenek 4990e1481ef15ec75e3503e0c6e5effad5bd639f01Ted Kremenek return NULL; 5090e1481ef15ec75e3503e0c6e5effad5bd639f01Ted Kremenek} 51a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 521c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuSVal::symbol_iterator SVal::symbol_end() const { 5390e1481ef15ec75e3503e0c6e5effad5bd639f01Ted Kremenek symbol_iterator X = symbol_begin(); 5490e1481ef15ec75e3503e0c6e5effad5bd639f01Ted Kremenek return X ? X+1 : NULL; 5590e1481ef15ec75e3503e0c6e5effad5bd639f01Ted Kremenek} 56cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek 57cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek//===----------------------------------------------------------------------===// 5840fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek// Useful predicates. 5940fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek//===----------------------------------------------------------------------===// 6040fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek 611c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xubool SVal::isZeroConstant() const { 621c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu if (isa<loc::ConcreteInt>(*this)) 631c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu return cast<loc::ConcreteInt>(*this).getValue() == 0; 641c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu else if (isa<nonloc::ConcreteInt>(*this)) 651c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu return cast<nonloc::ConcreteInt>(*this).getValue() == 0; 6640fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek else 6740fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek return false; 6840fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek} 6940fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek 7040fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek 7140fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek//===----------------------------------------------------------------------===// 721c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu// Transfer function dispatch for Non-Locs. 73cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek//===----------------------------------------------------------------------===// 74cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek 751c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuSVal nonloc::ConcreteInt::EvalBinOp(BasicValueFactory& BasicVals, 7675b0a1ce3e98904c6ac6c5634633b3580f5b4c7eTed Kremenek BinaryOperator::Opcode Op, 771c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu const nonloc::ConcreteInt& R) const { 78aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek 7975b0a1ce3e98904c6ac6c5634633b3580f5b4c7eTed Kremenek const llvm::APSInt* X = 8075b0a1ce3e98904c6ac6c5634633b3580f5b4c7eTed Kremenek BasicVals.EvaluateAPSInt(Op, getValue(), R.getValue()); 818cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek 828cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek if (X) 831c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu return nonloc::ConcreteInt(*X); 848cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek else 858cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek return UndefinedVal(); 86cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek} 87cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek 88cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek // Bitwise-Complement. 89cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek 901c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xunonloc::ConcreteInt 911c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xunonloc::ConcreteInt::EvalComplement(BasicValueFactory& BasicVals) const { 92240f1f00dda1d481276ea872fe8f8851581a7e6bTed Kremenek return BasicVals.getValue(~getValue()); 93cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek} 94cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek 95cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek // Unary Minus. 96a6e4d21dc4fe87fe1b0bcd9c3c3ec43b391aa44bTed Kremenek 971c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xunonloc::ConcreteInt 981c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xunonloc::ConcreteInt::EvalMinus(BasicValueFactory& BasicVals, UnaryOperator* U) const { 99cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek assert (U->getType() == U->getSubExpr()->getType()); 100cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek assert (U->getType()->isIntegerType()); 101240f1f00dda1d481276ea872fe8f8851581a7e6bTed Kremenek return BasicVals.getValue(-getValue()); 102c5d3b4ca4707b1fe69629bfefd73087dc4893dd8Ted Kremenek} 103c5d3b4ca4707b1fe69629bfefd73087dc4893dd8Ted Kremenek 104cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek//===----------------------------------------------------------------------===// 1051c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu// Transfer function dispatch for Locs. 106cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek//===----------------------------------------------------------------------===// 107c5d3b4ca4707b1fe69629bfefd73087dc4893dd8Ted Kremenek 1081c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuSVal 1091c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xuloc::ConcreteInt::EvalBinOp(BasicValueFactory& BasicVals, BinaryOperator::Opcode Op, 1101c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu const loc::ConcreteInt& R) const { 111cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek 112cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek assert (Op == BinaryOperator::Add || Op == BinaryOperator::Sub || 113cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek (Op >= BinaryOperator::LT && Op <= BinaryOperator::NE)); 114cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek 115240f1f00dda1d481276ea872fe8f8851581a7e6bTed Kremenek const llvm::APSInt* X = BasicVals.EvaluateAPSInt(Op, getValue(), R.getValue()); 1168cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek 1178cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek if (X) 1181c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu return loc::ConcreteInt(*X); 1198cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek else 1208cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek return UndefinedVal(); 121a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek} 122a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 1231c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuNonLoc Loc::EQ(BasicValueFactory& BasicVals, const Loc& R) const { 124aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek 125a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek switch (getSubKind()) { 126a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek default: 1271c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu assert(false && "EQ not implemented for this Loc."); 128aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek break; 129cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek 1301c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu case loc::ConcreteIntKind: 1311c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu if (isa<loc::ConcreteInt>(R)) { 1321c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu bool b = cast<loc::ConcreteInt>(this)->getValue() == 1331c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu cast<loc::ConcreteInt>(R).getValue(); 134cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek 1351c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu return NonLoc::MakeIntTruthVal(BasicVals, b); 1360806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek } 1371c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu else if (isa<loc::SymbolVal>(R)) { 138cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek 1390806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek const SymIntConstraint& C = 1401c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu BasicVals.getConstraint(cast<loc::SymbolVal>(R).getSymbol(), 141aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek BinaryOperator::EQ, 1421c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu cast<loc::ConcreteInt>(this)->getValue()); 1430806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek 1441c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu return nonloc::SymIntConstraintVal(C); 1450806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek } 1460806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek 1470806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek break; 1480806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek 1491c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu case loc::SymbolValKind: { 1501c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu if (isa<loc::ConcreteInt>(R)) { 151cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek 152cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek const SymIntConstraint& C = 1531c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu BasicVals.getConstraint(cast<loc::SymbolVal>(this)->getSymbol(), 154aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek BinaryOperator::EQ, 1551c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu cast<loc::ConcreteInt>(R).getValue()); 156cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek 1571c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu return nonloc::SymIntConstraintVal(C); 158cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek } 159cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek 1601c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu assert (!isa<loc::SymbolVal>(R) && "FIXME: Implement unification."); 1610806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek 162cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek break; 1630806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek } 164a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 1651c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu case loc::MemRegionKind: 1661c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu if (isa<loc::MemRegionVal>(R)) { 1671c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu bool b = cast<loc::MemRegionVal>(*this) == cast<loc::MemRegionVal>(R); 1681c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu return NonLoc::MakeIntTruthVal(BasicVals, b); 1690806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek } 1700806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek 1710806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek break; 172a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek } 1730806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek 1741c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu return NonLoc::MakeIntTruthVal(BasicVals, false); 175a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek} 176a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 1771c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuNonLoc Loc::NE(BasicValueFactory& BasicVals, const Loc& R) const { 178a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek switch (getSubKind()) { 179a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek default: 1801c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu assert(false && "NE not implemented for this Loc."); 181aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek break; 182a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 1831c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu case loc::ConcreteIntKind: 1841c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu if (isa<loc::ConcreteInt>(R)) { 1851c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu bool b = cast<loc::ConcreteInt>(this)->getValue() != 1861c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu cast<loc::ConcreteInt>(R).getValue(); 1870806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek 1881c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu return NonLoc::MakeIntTruthVal(BasicVals, b); 1890806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek } 1901c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu else if (isa<loc::SymbolVal>(R)) { 1910806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek 1920806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek const SymIntConstraint& C = 1931c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu BasicVals.getConstraint(cast<loc::SymbolVal>(R).getSymbol(), 1940806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek BinaryOperator::NE, 1951c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu cast<loc::ConcreteInt>(this)->getValue()); 1960806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek 1971c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu return nonloc::SymIntConstraintVal(C); 1980806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek } 199a6e4d21dc4fe87fe1b0bcd9c3c3ec43b391aa44bTed Kremenek 2000806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek break; 201a6e4d21dc4fe87fe1b0bcd9c3c3ec43b391aa44bTed Kremenek 2021c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu case loc::SymbolValKind: { 2031c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu if (isa<loc::ConcreteInt>(R)) { 2040806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek 2050806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek const SymIntConstraint& C = 2061c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu BasicVals.getConstraint(cast<loc::SymbolVal>(this)->getSymbol(), 2070806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek BinaryOperator::NE, 2081c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu cast<loc::ConcreteInt>(R).getValue()); 2090806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek 2101c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu return nonloc::SymIntConstraintVal(C); 2110806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek } 2120806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek 2131c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu assert (!isa<loc::SymbolVal>(R) && "FIXME: Implement sym !=."); 2140806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek 2150806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek break; 2160806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek } 2170806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek 2181c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu case loc::MemRegionKind: 2191c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu if (isa<loc::MemRegionVal>(R)) { 2201c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu bool b = cast<loc::MemRegionVal>(*this)==cast<loc::MemRegionVal>(R); 2211c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu return NonLoc::MakeIntTruthVal(BasicVals, b); 222aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek } 2230806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek 224aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek break; 225a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek } 2260806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek 2271c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu return NonLoc::MakeIntTruthVal(BasicVals, true); 228a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek} 229a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 230a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//===----------------------------------------------------------------------===// 2311c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu// Utility methods for constructing Non-Locs. 232a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//===----------------------------------------------------------------------===// 233a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 2341c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuNonLoc NonLoc::MakeVal(BasicValueFactory& BasicVals, uint64_t X, QualType T) { 2351c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu return nonloc::ConcreteInt(BasicVals.getValue(X, T)); 236a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek} 237a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 2381c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuNonLoc NonLoc::MakeVal(BasicValueFactory& BasicVals, IntegerLiteral* I) { 239aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek 2401c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu return nonloc::ConcreteInt(BasicVals.getValue(APSInt(I->getValue(), 241aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek I->getType()->isUnsignedIntegerType()))); 242a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek} 243a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 2441c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuNonLoc NonLoc::MakeIntTruthVal(BasicValueFactory& BasicVals, bool b) { 2451c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu return nonloc::ConcreteInt(BasicVals.getTruthValue(b)); 246cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek} 247cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek 2481c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuSVal SVal::GetSymbolValue(SymbolManager& SymMgr, VarDecl* D) { 249aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek 250a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek QualType T = D->getType(); 251a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 2521c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu if (Loc::IsLocType(T)) 2531c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu return loc::SymbolVal(SymMgr.getSymbol(D)); 254c1ff3cd5fe4436bb14309fdc5ee7e1c2b702b7c3Ted Kremenek 2551c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu return nonloc::SymbolVal(SymMgr.getSymbol(D)); 256a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek} 257a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 2582a502578a785d5e7ed9e08e2895dbdcfa5333c11Ted Kremenek//===----------------------------------------------------------------------===// 2591c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu// Utility methods for constructing Locs. 2602a502578a785d5e7ed9e08e2895dbdcfa5333c11Ted Kremenek//===----------------------------------------------------------------------===// 2612a502578a785d5e7ed9e08e2895dbdcfa5333c11Ted Kremenek 2621c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuLoc Loc::MakeVal(AddrLabelExpr* E) { return loc::GotoLabel(E->getLabel()); } 263cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek 2641c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuLoc Loc::MakeVal(StringLiteral* S) { 2651c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu return loc::StringLiteralVal(S); 266a548846b471f7ca05ec6038c7d9d3b4d0de777ccTed Kremenek} 267a548846b471f7ca05ec6038c7d9d3b4d0de777ccTed Kremenek 268a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//===----------------------------------------------------------------------===// 269a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// Pretty-Printing. 270a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//===----------------------------------------------------------------------===// 271a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 2721c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xuvoid SVal::printStdErr() const { print(*llvm::cerr.stream()); } 273aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek 2741c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xuvoid SVal::print(std::ostream& Out) const { 2752a502578a785d5e7ed9e08e2895dbdcfa5333c11Ted Kremenek 276a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek switch (getBaseKind()) { 277aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek 27853c641a735da0c3fe077aab63a6fef16c8798937Ted Kremenek case UnknownKind: 279aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek Out << "Invalid"; break; 280a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 2811c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu case NonLocKind: 2821c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu cast<NonLoc>(this)->print(Out); break; 283a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 2841c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu case LocKind: 2851c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu cast<Loc>(this)->print(Out); break; 286a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 2874a4e524afef40d6f3ddb25d0e407c814e4ca56a8Ted Kremenek case UndefinedKind: 2884a4e524afef40d6f3ddb25d0e407c814e4ca56a8Ted Kremenek Out << "Undefined"; break; 289a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 290a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek default: 2911c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu assert (false && "Invalid SVal."); 292a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek } 293a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek} 294a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 2950806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenekstatic void printOpcode(std::ostream& Out, BinaryOperator::Opcode Op) { 296aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek 297aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek switch (Op) { 298aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek case BinaryOperator::Mul: Out << '*' ; break; 299aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek case BinaryOperator::Div: Out << '/' ; break; 300aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek case BinaryOperator::Rem: Out << '%' ; break; 301aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek case BinaryOperator::Add: Out << '+' ; break; 302aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek case BinaryOperator::Sub: Out << '-' ; break; 30350d0ac299c641bee9024f3fbae2ea0640898a040Ted Kremenek case BinaryOperator::Shl: Out << "<<" ; break; 30450d0ac299c641bee9024f3fbae2ea0640898a040Ted Kremenek case BinaryOperator::Shr: Out << ">>" ; break; 305aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek case BinaryOperator::LT: Out << "<" ; break; 306aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek case BinaryOperator::GT: Out << '>' ; break; 307aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek case BinaryOperator::LE: Out << "<=" ; break; 308aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek case BinaryOperator::GE: Out << ">=" ; break; 309aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek case BinaryOperator::EQ: Out << "==" ; break; 310aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek case BinaryOperator::NE: Out << "!=" ; break; 311aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek case BinaryOperator::And: Out << '&' ; break; 312aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek case BinaryOperator::Xor: Out << '^' ; break; 313aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek case BinaryOperator::Or: Out << '|' ; break; 314aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek 3150806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek default: assert(false && "Not yet implemented."); 3160806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek } 3170806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek} 3180806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek 3191c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xuvoid NonLoc::print(std::ostream& Out) const { 320aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek 321a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek switch (getSubKind()) { 322aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek 3231c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu case nonloc::ConcreteIntKind: 3241c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu Out << cast<nonloc::ConcreteInt>(this)->getValue().getZExtValue(); 325cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek 3261c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu if (cast<nonloc::ConcreteInt>(this)->getValue().isUnsigned()) 327cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek Out << 'U'; 328cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek 329a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek break; 330a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 3311c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu case nonloc::SymbolValKind: 3321c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu Out << '$' << cast<nonloc::SymbolVal>(this)->getSymbol(); 333a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek break; 3340806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek 3351c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu case nonloc::SymIntConstraintValKind: { 3361c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu const nonloc::SymIntConstraintVal& C = 3371c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu *cast<nonloc::SymIntConstraintVal>(this); 3380806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek 3390806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek Out << '$' << C.getConstraint().getSymbol() << ' '; 3400806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek printOpcode(Out, C.getConstraint().getOpcode()); 341405674c26c52b05df0d833fae6bae818cd52bc32Chris Lattner Out << ' ' << C.getConstraint().getInt().getZExtValue(); 342cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek 343cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek if (C.getConstraint().getInt().isUnsigned()) 344cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek Out << 'U'; 345cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek 3460806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek break; 3470fe33bc94a822e315585e5cde1964d3c3b9052f9Ted Kremenek } 3480fe33bc94a822e315585e5cde1964d3c3b9052f9Ted Kremenek 3491c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu case nonloc::LocAsIntegerKind: { 3501c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu const nonloc::LocAsInteger& C = *cast<nonloc::LocAsInteger>(this); 3511c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu C.getLoc().print(Out); 3520fe33bc94a822e315585e5cde1964d3c3b9052f9Ted Kremenek Out << " [as " << C.getNumBits() << " bit integer]"; 3530fe33bc94a822e315585e5cde1964d3c3b9052f9Ted Kremenek break; 3540fe33bc94a822e315585e5cde1964d3c3b9052f9Ted Kremenek } 355a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 356a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek default: 3571c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu assert (false && "Pretty-printed not implemented for this NonLoc."); 358a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek break; 359a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek } 360a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek} 361a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 3621c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xuvoid Loc::print(std::ostream& Out) const { 363aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek 364a6e4d21dc4fe87fe1b0bcd9c3c3ec43b391aa44bTed Kremenek switch (getSubKind()) { 365aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek 3661c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu case loc::ConcreteIntKind: 3671c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu Out << cast<loc::ConcreteInt>(this)->getValue().getZExtValue() 3681c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu << " (Loc)"; 369a6e4d21dc4fe87fe1b0bcd9c3c3ec43b391aa44bTed Kremenek break; 370a6e4d21dc4fe87fe1b0bcd9c3c3ec43b391aa44bTed Kremenek 3711c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu case loc::SymbolValKind: 3721c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu Out << '$' << cast<loc::SymbolVal>(this)->getSymbol(); 373a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek break; 3742a502578a785d5e7ed9e08e2895dbdcfa5333c11Ted Kremenek 3751c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu case loc::GotoLabelKind: 3762a502578a785d5e7ed9e08e2895dbdcfa5333c11Ted Kremenek Out << "&&" 3771c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu << cast<loc::GotoLabel>(this)->getLabel()->getID()->getName(); 3782a502578a785d5e7ed9e08e2895dbdcfa5333c11Ted Kremenek break; 37908b66255e2605adfa8777dbff293db1c69bc1092Ted Kremenek 3801c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu case loc::MemRegionKind: 3811c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu Out << '&' << cast<loc::MemRegionVal>(this)->getRegion()->getString(); 382de43424560f1a744de6214dab6bbee28ad8437f5Ted Kremenek break; 383de43424560f1a744de6214dab6bbee28ad8437f5Ted Kremenek 3841c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu case loc::FuncValKind: 385de43424560f1a744de6214dab6bbee28ad8437f5Ted Kremenek Out << "function " 3861c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu << cast<loc::FuncVal>(this)->getDecl()->getIdentifier()->getName(); 387a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek break; 388a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek 3891c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu case loc::StringLiteralValKind: 390a548846b471f7ca05ec6038c7d9d3b4d0de777ccTed Kremenek Out << "literal \"" 3911c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu << cast<loc::StringLiteralVal>(this)->getLiteral()->getStrData() 392a548846b471f7ca05ec6038c7d9d3b4d0de777ccTed Kremenek << "\""; 393a548846b471f7ca05ec6038c7d9d3b4d0de777ccTed Kremenek break; 394a548846b471f7ca05ec6038c7d9d3b4d0de777ccTed Kremenek 395a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek default: 3961c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu assert (false && "Pretty-printing not implemented for this Loc."); 397a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek break; 398a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek } 399a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek} 4009012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4019012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu//===----------------------------------------------------------------------===// 4029012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu// Pretty-Printing with llvm::raw_ostream. 4039012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu//===----------------------------------------------------------------------===// 4049012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4059012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xuvoid SVal::print(llvm::raw_ostream& Out) const { 4069012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4079012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu switch (getBaseKind()) { 4089012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4099012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case UnknownKind: 4109012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu Out << "Invalid"; break; 4119012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4129012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case NonLocKind: 4139012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu cast<NonLoc>(this)->print(Out); break; 4149012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4159012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case LocKind: 4169012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu cast<Loc>(this)->print(Out); break; 4179012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4189012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case UndefinedKind: 4199012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu Out << "Undefined"; break; 4209012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4219012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu default: 4229012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu assert (false && "Invalid SVal."); 4239012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu } 4249012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu} 4259012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4269012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xustatic void printOpcode(llvm::raw_ostream& Out, BinaryOperator::Opcode Op) { 4279012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4289012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu switch (Op) { 4299012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case BinaryOperator::Mul: Out << '*' ; break; 4309012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case BinaryOperator::Div: Out << '/' ; break; 4319012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case BinaryOperator::Rem: Out << '%' ; break; 4329012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case BinaryOperator::Add: Out << '+' ; break; 4339012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case BinaryOperator::Sub: Out << '-' ; break; 4349012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case BinaryOperator::Shl: Out << "<<" ; break; 4359012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case BinaryOperator::Shr: Out << ">>" ; break; 4369012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case BinaryOperator::LT: Out << "<" ; break; 4379012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case BinaryOperator::GT: Out << '>' ; break; 4389012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case BinaryOperator::LE: Out << "<=" ; break; 4399012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case BinaryOperator::GE: Out << ">=" ; break; 4409012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case BinaryOperator::EQ: Out << "==" ; break; 4419012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case BinaryOperator::NE: Out << "!=" ; break; 4429012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case BinaryOperator::And: Out << '&' ; break; 4439012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case BinaryOperator::Xor: Out << '^' ; break; 4449012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case BinaryOperator::Or: Out << '|' ; break; 4459012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4469012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu default: assert(false && "Not yet implemented."); 4479012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu } 4489012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu} 4499012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4509012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xuvoid NonLoc::print(llvm::raw_ostream& Out) const { 4519012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4529012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu switch (getSubKind()) { 4539012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4549012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case nonloc::ConcreteIntKind: 4559012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu Out << cast<nonloc::ConcreteInt>(this)->getValue().getZExtValue(); 4569012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4579012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu if (cast<nonloc::ConcreteInt>(this)->getValue().isUnsigned()) 4589012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu Out << 'U'; 4599012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4609012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu break; 4619012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4629012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case nonloc::SymbolValKind: 4639012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu Out << '$' << cast<nonloc::SymbolVal>(this)->getSymbol(); 4649012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu break; 4659012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4669012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case nonloc::SymIntConstraintValKind: { 4679012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu const nonloc::SymIntConstraintVal& C = 4689012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu *cast<nonloc::SymIntConstraintVal>(this); 4699012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4709012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu Out << '$' << C.getConstraint().getSymbol() << ' '; 4719012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu printOpcode(Out, C.getConstraint().getOpcode()); 4729012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu Out << ' ' << C.getConstraint().getInt().getZExtValue(); 4739012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4749012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu if (C.getConstraint().getInt().isUnsigned()) 4759012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu Out << 'U'; 4769012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4779012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu break; 4789012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu } 4799012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4809012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case nonloc::LocAsIntegerKind: { 4819012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu const nonloc::LocAsInteger& C = *cast<nonloc::LocAsInteger>(this); 4829012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu C.getLoc().print(Out); 4839012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu Out << " [as " << C.getNumBits() << " bit integer]"; 4849012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu break; 4859012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu } 4869012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4879012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu default: 4889012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu assert (false && "Pretty-printed not implemented for this NonLoc."); 4899012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu break; 4909012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu } 4919012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu} 4929012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4939012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xuvoid Loc::print(llvm::raw_ostream& Out) const { 4949012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4959012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu switch (getSubKind()) { 4969012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 4979012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case loc::ConcreteIntKind: 4989012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu Out << cast<loc::ConcreteInt>(this)->getValue().getZExtValue() 4999012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu << " (Loc)"; 5009012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu break; 5019012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 5029012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case loc::SymbolValKind: 5039012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu Out << '$' << cast<loc::SymbolVal>(this)->getSymbol(); 5049012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu break; 5059012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 5069012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case loc::GotoLabelKind: 5079012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu Out << "&&" 5089012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu << cast<loc::GotoLabel>(this)->getLabel()->getID()->getName(); 5099012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu break; 5109012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 5119012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case loc::MemRegionKind: 5129012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu Out << '&' << cast<loc::MemRegionVal>(this)->getRegion()->getString(); 5139012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu break; 5149012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 5159012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case loc::FuncValKind: 5169012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu Out << "function " 5179012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu << cast<loc::FuncVal>(this)->getDecl()->getIdentifier()->getName(); 5189012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu break; 5199012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 5209012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu case loc::StringLiteralValKind: 5219012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu Out << "literal \"" 5229012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu << cast<loc::StringLiteralVal>(this)->getLiteral()->getStrData() 5239012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu << "\""; 5249012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu break; 5259012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu 5269012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu default: 5279012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu assert (false && "Pretty-printing not implemented for this Loc."); 5289012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu break; 5299012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu } 5309012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu} 531