28 llvm_unreachable(
"Unhandled ProgramPoint kind");
57 const bool AddQuotes =
true;
59 Out <<
"\"kind\": \"";
62 Out <<
"BlockEntrance\""
64 << castAs<BlockEntrance>().getBlock()->getBlockID();
68 auto FEP = getAs<FunctionExitPoint>();
69 Out <<
"FunctionExit\""
70 <<
", \"block_id\": " << FEP->getBlock()->getBlockID()
74 Out << RS->getID(Context) <<
", \"stmt\": ";
75 RS->printJson(Out,
nullptr, PP, AddQuotes);
77 Out <<
"null, \"stmt\": null";
82 llvm_unreachable(
"BlockExitKind");
85 Out <<
"CallEnter\", \"callee_decl\": \"";
87 castAs<CallEnter>().getCalleeContext()->getDecl())
91 Out <<
"CallExitBegin\"";
94 Out <<
"CallExitEnd\"";
97 Out <<
"EpsilonPoint\"";
101 Out <<
"LoopExit\", \"stmt\": \""
102 << castAs<LoopExit>().getLoopStmt()->getStmtClassName() <<
'\"';
107 Out <<
"PreCall\", \"decl\": \""
109 <<
"\", \"location\": ";
116 Out <<
"PostCall\", \"decl\": \""
118 <<
"\", \"location\": ";
124 Out <<
"PostInitializer\", ";
127 Out <<
"\"field_decl\": \"" << *FD <<
'\"';
129 Out <<
"\"type\": \"";
140 const Stmt *
T =
E.getSrc()->getTerminatorStmt();
141 Out <<
"Edge\", \"src_id\": " <<
E.getSrc()->getBlockID()
142 <<
", \"dst_id\": " <<
E.getDst()->getBlockID() <<
", \"terminator\": ";
145 Out <<
"null, \"term_kind\": null";
149 E.getSrc()->printTerminatorJson(Out, Context.
getLangOpts(),
151 Out <<
", \"location\": ";
154 Out <<
", \"term_kind\": \"";
155 if (isa<SwitchStmt>(
T)) {
156 Out <<
"SwitchStmt\", \"case\": ";
157 if (
const Stmt *
Label =
E.getDst()->getLabel()) {
158 if (
const auto *
C = dyn_cast<CaseStmt>(
Label)) {
159 Out <<
"{ \"lhs\": ";
160 if (
const Stmt *LHS =
C->getLHS()) {
161 LHS->printJson(Out,
nullptr, PP, AddQuotes);
166 Out <<
", \"rhs\": ";
167 if (
const Stmt *RHS =
C->getRHS()) {
168 RHS->printJson(Out,
nullptr, PP, AddQuotes);
174 assert(isa<DefaultStmt>(
Label));
175 Out <<
"\"default\"";
178 Out <<
"\"implicit default\"";
180 }
else if (isa<IndirectGotoStmt>(
T)) {
182 Out <<
"IndirectGotoStmt\"";
184 Out <<
"Condition\", \"value\": "
185 << (*
E.getSrc()->succ_begin() ==
E.getDst() ?
"true" :
"false");
191 const Stmt *S = castAs<StmtPoint>().getStmt();
192 assert(S !=
nullptr &&
"Expecting non-null Stmt");
194 Out <<
"Statement\", \"stmt_kind\": \"" << S->getStmtClassName()
195 <<
"\", \"stmt_id\": " << S->getID(Context)
196 <<
", \"pointer\": \"" << (
const void *)S <<
"\", ";
197 if (
const auto *CS = dyn_cast<CastExpr>(S))
198 Out <<
"\"cast_kind\": \"" << CS->getCastKindName() <<
"\", ";
200 Out <<
"\"pretty\": ";
202 S->printJson(Out,
nullptr, PP, AddQuotes);
204 Out <<
", \"location\": ";
207 Out <<
", \"stmt_point_kind\": \"";
208 if (getAs<PreLoad>())
210 else if (getAs<PreStore>())
212 else if (getAs<PostAllocatorCall>())
213 Out <<
"PostAllocatorCall";
214 else if (getAs<PostCondition>())
215 Out <<
"PostCondition";
216 else if (getAs<PostLoad>())
218 else if (getAs<PostLValue>())
220 else if (getAs<PostStore>())
222 else if (getAs<PostStmt>())
224 else if (getAs<PostStmtPurgeDeadSymbols>())
225 Out <<
"PostStmtPurgeDeadSymbols";
226 else if (getAs<PreStmtPurgeDeadSymbols>())
227 Out <<
"PreStmtPurgeDeadSymbols";
228 else if (getAs<PreStmt>())
231 Out <<
"\nKind: '" <<
getKind();
232 llvm_unreachable(
"' is unhandled StmtPoint kind!");
243 : Desc((MsgProvider +
" : " + Msg).str()) {}
Defines the clang::ASTContext interface.
This file defines AnalysisDeclContext, a class that manages the analysis context data for context sen...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
const LangOptions & getLangOpts() const
const clang::PrintingPolicy & getPrintingPolicy() const
static std::string getFunctionName(const Decl *D)
ASTContext & getASTContext() const
Represents a C++ base or member initializer.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
Represents a member of a struct/union/class.
Represents an implicit call event.
SourceLocation getLocation() const
const Decl * getDecl() const
It wraps the AnalysisDeclContext to represent both the call stack with the help of StackFrameContext ...
LLVM_ATTRIBUTE_RETURNS_NONNULL AnalysisDeclContext * getAnalysisDeclContext() const
std::string getQualifiedNameAsString() const
Represents a point after we ran remove dead bindings AFTER processing the given statement.
Represents a point after we ran remove dead bindings BEFORE processing the given statement.
ProgramPoints can be "tagged" as representing points specific to a given analysis entity.
virtual ~ProgramPointTag()
static ProgramPoint getProgramPoint(const Stmt *S, ProgramPoint::Kind K, const LocationContext *LC, const ProgramPointTag *tag)
LLVM_DUMP_METHOD void dump() const
void printJson(llvm::raw_ostream &Out, const char *NL="\n") const
@ PreStmtPurgeDeadSymbolsKind
@ PostStmtPurgeDeadSymbolsKind
const LocationContext * getLocationContext() const
A (possibly-)qualified type.
QualType getLocalUnqualifiedType() const
Return this type with all of the instance-specific qualifiers removed, but without removing any quali...
void print(raw_ostream &OS, const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
SimpleProgramPointTag(StringRef MsgProvider, StringRef Msg)
StringRef getTagDescription() const override
This class handles loading and caching of source files into memory.
Stmt - This represents one statement.
The JSON file list parser is used to communicate input to InstallAPI.
void printSourceLocationAsJson(raw_ostream &Out, SourceLocation Loc, const SourceManager &SM, bool AddBraces=true)
const FunctionProtoType * T
Describes how types, statements, expressions, and declarations should be printed.