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"
42 case Stmt::OpaqueValueExprClass:
43 if (
const Expr *SE = cast<OpaqueValueExpr>(
E)->getSourceExpr()) {
48 case Stmt::ExprWithCleanupsClass:
49 E = cast<ExprWithCleanups>(
E)->getSubExpr();
51 case Stmt::ConstantExprClass:
52 E = cast<ConstantExpr>(
E)->getSubExpr();
54 case Stmt::CXXBindTemporaryExprClass:
55 E = cast<CXXBindTemporaryExpr>(
E)->getSubExpr();
57 case Stmt::SubstNonTypeTemplateParmExprClass:
58 E = cast<SubstNonTypeTemplateParmExpr>(
E)->getReplacement();
69 if (
const auto *
E = dyn_cast<Expr>(S))
77 L ? L->getStackFrame()
81 const SVal*
X = ExprBindings.lookup(
E);
92 assert(!isa<ObjCForCollectionStmt>(S) &&
93 "Use ExprEngine::hasMoreIteration()!");
94 assert((isa<Expr, ReturnStmt>(S)) &&
95 "Environment can only argue about Exprs, since only they express "
96 "a value! Any non-expression statement stored in Environment is a "
100 switch (S->getStmtClass()) {
101 case Stmt::CXXBindTemporaryExprClass:
102 case Stmt::ExprWithCleanupsClass:
103 case Stmt::GenericSelectionExprClass:
104 case Stmt::ConstantExprClass:
105 case Stmt::ParenExprClass:
106 case Stmt::SubstNonTypeTemplateParmExprClass:
107 llvm_unreachable(
"Should have been handled by ignoreTransparentExprs");
109 case Stmt::AddrLabelExprClass:
110 case Stmt::CharacterLiteralClass:
111 case Stmt::CXXBoolLiteralExprClass:
112 case Stmt::CXXScalarValueInitExprClass:
113 case Stmt::ImplicitValueInitExprClass:
114 case Stmt::IntegerLiteralClass:
115 case Stmt::ObjCBoolLiteralExprClass:
116 case Stmt::CXXNullPtrLiteralExprClass:
117 case Stmt::ObjCStringLiteralClass:
118 case Stmt::StringLiteralClass:
119 case Stmt::TypeTraitExprClass:
120 case Stmt::SizeOfPackExprClass:
121 case Stmt::PredefinedExprClass:
125 case Stmt::ReturnStmtClass: {
126 const auto *RS = cast<ReturnStmt>(S);
127 if (
const Expr *RE = RS->getRetValue())
157 MarkLiveCallback(
SymbolReaper &symreaper) : SymReaper(symreaper) {}
159 bool VisitSymbol(
SymbolRef sym)
override {
160 SymReaper.markLive(sym);
164 bool VisitMemRegion(
const MemRegion *R)
override {
165 SymReaper.markLive(R);
188 MarkLiveCallback CB(SymReaper);
191 llvm::ImmutableMapRef<EnvironmentEntry, SVal>
192 EBMapRef(NewEnv.ExprBindings.getRootWithoutRetain(),
198 SVal X = I.getData();
206 EBMapRef = EBMapRef.add(BlkExpr,
X);
213 NewEnv.ExprBindings = EBMapRef.asImmutableMap();
219 unsigned int Space,
bool IsDot)
const {
220 Indent(Out, Space, IsDot) <<
"\"environment\": ";
222 if (ExprBindings.isEmpty()) {
223 Out <<
"null," << NL;
231 for (
const auto &I : *
this) {
233 if (FoundContexts.count(LC) == 0) {
237 FoundContexts.insert(LCI);
244 Out <<
"{ \"pointer\": \"" << (
const void *)LCtx->
getStackFrame()
245 <<
"\", \"items\": [" << NL;
250 bool HasItem =
false;
251 unsigned int InnerSpace = Space + 1;
254 BindingsTy::iterator LastI = ExprBindings.end();
255 for (BindingsTy::iterator I = ExprBindings.begin(); I != ExprBindings.end();
257 if (I->first.getLocationContext() != LC)