|
@@ -2962,183 +2962,6 @@ struct DOTGraphTraits<ExplodedGraph*> : public DefaultDOTGraphTraits {
|
|
|
return {};
|
|
|
}
|
|
|
|
|
|
- // De-duplicate some source location pretty-printing.
|
|
|
- static void printLocation(raw_ostream &Out,
|
|
|
- SourceLocation SLoc,
|
|
|
- const SourceManager &SM,
|
|
|
- StringRef Postfix="\\l") {
|
|
|
- if (SLoc.isFileID()) {
|
|
|
- Out << "\\lline="
|
|
|
- << SM.getExpansionLineNumber(SLoc)
|
|
|
- << " col="
|
|
|
- << SM.getExpansionColumnNumber(SLoc)
|
|
|
- << Postfix;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- static void dumpProgramPoint(ProgramPoint Loc,
|
|
|
- const ASTContext &Context,
|
|
|
- llvm::raw_string_ostream &Out) {
|
|
|
- const SourceManager &SM = Context.getSourceManager();
|
|
|
- switch (Loc.getKind()) {
|
|
|
- case ProgramPoint::BlockEntranceKind:
|
|
|
- Out << "Block Entrance: B"
|
|
|
- << Loc.castAs<BlockEntrance>().getBlock()->getBlockID();
|
|
|
- break;
|
|
|
-
|
|
|
- case ProgramPoint::FunctionExitKind: {
|
|
|
- auto FEP = Loc.getAs<FunctionExitPoint>();
|
|
|
- Out << "Function Exit: B"
|
|
|
- << FEP->getBlock()->getBlockID();
|
|
|
- if (const ReturnStmt *RS = FEP->getStmt()) {
|
|
|
- Out << "\\l Return: S" << RS->getID(Context) << "\\l";
|
|
|
- RS->printPretty(Out, /*helper=*/nullptr, Context.getPrintingPolicy(),
|
|
|
- /*Indentation=*/2, /*NewlineSymbol=*/"\\l");
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
- case ProgramPoint::BlockExitKind:
|
|
|
- assert(false);
|
|
|
- break;
|
|
|
-
|
|
|
- case ProgramPoint::CallEnterKind:
|
|
|
- Out << "CallEnter";
|
|
|
- break;
|
|
|
-
|
|
|
- case ProgramPoint::CallExitBeginKind:
|
|
|
- Out << "CallExitBegin";
|
|
|
- break;
|
|
|
-
|
|
|
- case ProgramPoint::CallExitEndKind:
|
|
|
- Out << "CallExitEnd";
|
|
|
- break;
|
|
|
-
|
|
|
- case ProgramPoint::PostStmtPurgeDeadSymbolsKind:
|
|
|
- Out << "PostStmtPurgeDeadSymbols";
|
|
|
- break;
|
|
|
-
|
|
|
- case ProgramPoint::PreStmtPurgeDeadSymbolsKind:
|
|
|
- Out << "PreStmtPurgeDeadSymbols";
|
|
|
- break;
|
|
|
-
|
|
|
- case ProgramPoint::EpsilonKind:
|
|
|
- Out << "Epsilon Point";
|
|
|
- break;
|
|
|
-
|
|
|
- case ProgramPoint::LoopExitKind: {
|
|
|
- LoopExit LE = Loc.castAs<LoopExit>();
|
|
|
- Out << "LoopExit: " << LE.getLoopStmt()->getStmtClassName();
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- case ProgramPoint::PreImplicitCallKind: {
|
|
|
- ImplicitCallPoint PC = Loc.castAs<ImplicitCallPoint>();
|
|
|
- Out << "PreCall: ";
|
|
|
- PC.getDecl()->print(Out, Context.getLangOpts());
|
|
|
- printLocation(Out, PC.getLocation(), SM);
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- case ProgramPoint::PostImplicitCallKind: {
|
|
|
- ImplicitCallPoint PC = Loc.castAs<ImplicitCallPoint>();
|
|
|
- Out << "PostCall: ";
|
|
|
- PC.getDecl()->print(Out, Context.getLangOpts());
|
|
|
- printLocation(Out, PC.getLocation(), SM);
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- case ProgramPoint::PostInitializerKind: {
|
|
|
- Out << "PostInitializer: ";
|
|
|
- const CXXCtorInitializer *Init =
|
|
|
- Loc.castAs<PostInitializer>().getInitializer();
|
|
|
- if (const FieldDecl *FD = Init->getAnyMember())
|
|
|
- Out << *FD;
|
|
|
- else {
|
|
|
- QualType Ty = Init->getTypeSourceInfo()->getType();
|
|
|
- Ty = Ty.getLocalUnqualifiedType();
|
|
|
- Ty.print(Out, Context.getLangOpts());
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- case ProgramPoint::BlockEdgeKind: {
|
|
|
- const BlockEdge &E = Loc.castAs<BlockEdge>();
|
|
|
- Out << "Edge: (B" << E.getSrc()->getBlockID() << ", B"
|
|
|
- << E.getDst()->getBlockID() << ')';
|
|
|
-
|
|
|
- if (const Stmt *T = E.getSrc()->getTerminator()) {
|
|
|
- SourceLocation SLoc = T->getBeginLoc();
|
|
|
-
|
|
|
- Out << "\\|Terminator: ";
|
|
|
- E.getSrc()->printTerminator(Out, Context.getLangOpts());
|
|
|
- printLocation(Out, SLoc, SM, /*Postfix=*/"");
|
|
|
-
|
|
|
- if (isa<SwitchStmt>(T)) {
|
|
|
- const Stmt *Label = E.getDst()->getLabel();
|
|
|
-
|
|
|
- if (Label) {
|
|
|
- if (const auto *C = dyn_cast<CaseStmt>(Label)) {
|
|
|
- Out << "\\lcase ";
|
|
|
- if (C->getLHS())
|
|
|
- C->getLHS()->printPretty(
|
|
|
- Out, nullptr, Context.getPrintingPolicy(),
|
|
|
- /*Indentation=*/0, /*NewlineSymbol=*/"\\l");
|
|
|
-
|
|
|
- if (const Stmt *RHS = C->getRHS()) {
|
|
|
- Out << " .. ";
|
|
|
- RHS->printPretty(Out, nullptr, Context.getPrintingPolicy(),
|
|
|
- /*Indetation=*/0, /*NewlineSymbol=*/"\\l");
|
|
|
- }
|
|
|
-
|
|
|
- Out << ":";
|
|
|
- } else {
|
|
|
- assert(isa<DefaultStmt>(Label));
|
|
|
- Out << "\\ldefault:";
|
|
|
- }
|
|
|
- } else
|
|
|
- Out << "\\l(implicit) default:";
|
|
|
- } else if (isa<IndirectGotoStmt>(T)) {
|
|
|
- // FIXME
|
|
|
- } else {
|
|
|
- Out << "\\lCondition: ";
|
|
|
- if (*E.getSrc()->succ_begin() == E.getDst())
|
|
|
- Out << "true";
|
|
|
- else
|
|
|
- Out << "false";
|
|
|
- }
|
|
|
-
|
|
|
- Out << "\\l";
|
|
|
- }
|
|
|
-
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- default: {
|
|
|
- const Stmt *S = Loc.castAs<StmtPoint>().getStmt();
|
|
|
- assert(S != nullptr && "Expecting non-null Stmt");
|
|
|
-
|
|
|
- Out << S->getStmtClassName() << " S"
|
|
|
- << S->getID(Context) << " <" << (const void *)S << "> ";
|
|
|
- S->printPretty(Out, /*helper=*/nullptr, Context.getPrintingPolicy(),
|
|
|
- /*Indentation=*/2, /*NewlineSymbol=*/"\\l");
|
|
|
- printLocation(Out, S->getBeginLoc(), SM, /*Postfix=*/"");
|
|
|
-
|
|
|
- if (Loc.getAs<PreStmt>())
|
|
|
- Out << "\\lPreStmt\\l";
|
|
|
- else if (Loc.getAs<PostLoad>())
|
|
|
- Out << "\\lPostLoad\\l";
|
|
|
- else if (Loc.getAs<PostStore>())
|
|
|
- Out << "\\lPostStore\\l";
|
|
|
- else if (Loc.getAs<PostLValue>())
|
|
|
- Out << "\\lPostLValue\\l";
|
|
|
- else if (Loc.getAs<PostAllocatorCall>())
|
|
|
- Out << "\\lPostAllocatorCall\\l";
|
|
|
-
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
static bool isNodeHidden(const ExplodedNode *N) {
|
|
|
return N->isTrivial();
|
|
|
}
|
|
@@ -3156,12 +2979,11 @@ struct DOTGraphTraits<ExplodedGraph*> : public DefaultDOTGraphTraits {
|
|
|
}
|
|
|
|
|
|
ProgramStateRef State = N->getState();
|
|
|
- const ASTContext &Context = State->getStateManager().getContext();
|
|
|
|
|
|
// Dump program point for all the previously skipped nodes.
|
|
|
const ExplodedNode *OtherNode = FirstHiddenNode;
|
|
|
while (true) {
|
|
|
- dumpProgramPoint(OtherNode->getLocation(), Context, Out);
|
|
|
+ OtherNode->getLocation().print(/*CR=*/"\\l", Out);
|
|
|
|
|
|
if (const ProgramPointTag *Tag = OtherNode->getLocation().getTag())
|
|
|
Out << "\\lTag:" << Tag->getTagDescription();
|