28 #include "llvm/ADT/ImmutableMap.h"
29 #include "llvm/ADT/SmallPtrSet.h"
30 #include "llvm/Support/Casting.h"
31 #include "llvm/Support/ErrorHandling.h"
32 #include "llvm/Support/raw_ostream.h"
35 using namespace clang;
42 case Stmt::OpaqueValueExprClass:
43 E = cast<OpaqueValueExpr>(E)->getSourceExpr();
45 case Stmt::ExprWithCleanupsClass:
46 E = cast<ExprWithCleanups>(E)->getSubExpr();
48 case Stmt::ConstantExprClass:
49 E = cast<ConstantExpr>(E)->getSubExpr();
51 case Stmt::CXXBindTemporaryExprClass:
52 E = cast<CXXBindTemporaryExpr>(E)->getSubExpr();
54 case Stmt::SubstNonTypeTemplateParmExprClass:
55 E = cast<SubstNonTypeTemplateParmExpr>(E)->getReplacement();
66 if (
const auto *E = dyn_cast<Expr>(S))
74 L ? L->getStackFrame()
78 const SVal*
X = ExprBindings.lookup(E);
89 assert(!isa<ObjCForCollectionStmt>(S) &&
90 "Use ExprEngine::hasMoreIteration()!");
91 assert((isa<Expr>(S) || isa<ReturnStmt>(S)) &&
92 "Environment can only argue about Exprs, since only they express "
93 "a value! Any non-expression statement stored in Environment is a "
97 switch (S->getStmtClass()) {
98 case Stmt::CXXBindTemporaryExprClass:
99 case Stmt::ExprWithCleanupsClass:
100 case Stmt::GenericSelectionExprClass:
101 case Stmt::OpaqueValueExprClass:
102 case Stmt::ConstantExprClass:
103 case Stmt::ParenExprClass:
104 case Stmt::SubstNonTypeTemplateParmExprClass:
105 llvm_unreachable(
"Should have been handled by ignoreTransparentExprs");
107 case Stmt::AddrLabelExprClass:
108 case Stmt::CharacterLiteralClass:
109 case Stmt::CXXBoolLiteralExprClass:
110 case Stmt::CXXScalarValueInitExprClass:
111 case Stmt::ImplicitValueInitExprClass:
112 case Stmt::IntegerLiteralClass:
113 case Stmt::ObjCBoolLiteralExprClass:
114 case Stmt::CXXNullPtrLiteralExprClass:
115 case Stmt::ObjCStringLiteralClass:
116 case Stmt::StringLiteralClass:
117 case Stmt::TypeTraitExprClass:
118 case Stmt::SizeOfPackExprClass:
119 case Stmt::PredefinedExprClass:
123 case Stmt::ReturnStmtClass: {
124 const auto *RS = cast<ReturnStmt>(S);
125 if (
const Expr *RE = RS->getRetValue())
155 MarkLiveCallback(
SymbolReaper &symreaper) : SymReaper(symreaper) {}
157 bool VisitSymbol(
SymbolRef sym)
override {
158 SymReaper.markLive(sym);
162 bool VisitMemRegion(
const MemRegion *R)
override {
163 SymReaper.markLive(R);
186 MarkLiveCallback CB(SymReaper);
189 llvm::ImmutableMapRef<EnvironmentEntry, SVal>
190 EBMapRef(NewEnv.ExprBindings.getRootWithoutRetain(),
196 const SVal &
X = I.getData();
204 EBMapRef = EBMapRef.add(BlkExpr,
X);
211 NewEnv.ExprBindings = EBMapRef.asImmutableMap();
217 unsigned int Space,
bool IsDot)
const {
218 Indent(Out, Space, IsDot) <<
"\"environment\": ";
220 if (ExprBindings.isEmpty()) {
221 Out <<
"null," << NL;
229 for (
const auto &I : *
this) {
231 if (FoundContexts.count(LC) == 0) {
235 FoundContexts.insert(LCI);
242 Out <<
"{ \"pointer\": \"" << (
const void *)LCtx->
getStackFrame()
243 <<
"\", \"items\": [" << NL;
248 bool HasItem =
false;
249 unsigned int InnerSpace = Space + 1;
252 BindingsTy::iterator LastI = ExprBindings.end();
253 for (BindingsTy::iterator I = ExprBindings.begin(); I != ExprBindings.end();
255 if (I->first.getLocationContext() != LC)
263 const Stmt *S = I->first.getStmt();
265 assert(S !=
nullptr &&
"Expected non-null Stmt");
270 for (BindingsTy::iterator I = ExprBindings.begin(); I != ExprBindings.end();
272 if (I->first.getLocationContext() != LC)
275 const Stmt *S = I->first.getStmt();
276 Indent(Out, InnerSpace, IsDot)
277 <<
"{ \"stmt_id\": " << S->getID(Ctx) <<
", \"pretty\": ";
278 S->printJson(Out,
nullptr, PP,
true);
280 Out <<
", \"value\": ";
281 I->second.printJson(Out,
true);
291 Indent(Out, --InnerSpace, IsDot) <<
']';
296 Indent(Out, --Space, IsDot) <<
"]}," << NL;