r361997 - [analyzer] print() JSONify: getNodeLabel implementation
Roman Lebedev via cfe-commits
cfe-commits at lists.llvm.org
Thu May 30 07:51:33 PDT 2019
On Thu, May 30, 2019 at 5:48 PM Csaba Dabis via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
>
> Thanks you!
>
> Fixed by https://github.com/llvm/llvm-project/commit/17604c3486cbe7c27cadac1757cd0a9109a92792
The non-determinism is still there though, so this isn't correct fix.
> On Thu, May 30, 2019 at 4:16 PM Russell Gallop <russell.gallop at gmail.com> wrote:
>>
>> Hi Csaba,
>>
>> Failing example attached. Note that the output is different every time so there is potentially more than one failure mode.
>>
>> Thanks
>> Russ
>>
>> On Thu, 30 May 2019 at 15:05, Csaba Dabis <dabis.csaba98 at gmail.com> wrote:
>>>
>>> Hey!
>>>
>>> When it fails, could you provide the DOT dump? The path is: llvm-project/build/tools/clang/test/Analysis/Output/dump_egraph.cpp.tmp.dot
>>>
>>> Thanks,
>>> Csaba.
>>>
>>> On Thu, May 30, 2019 at 4:00 PM Russell Gallop <russell.gallop at gmail.com> wrote:
>>>>
>>>> Hi Csaba,
>>>>
>>>> The test dump_egraph.cpp appears to be flaky on Windows. For example here: http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast/builds/26183.
>>>>
>>>> C:\ps4-buildslave2\llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast\llvm.src\tools\clang\test\Analysis\dump_egraph.cpp:23:11: error: CHECK: expected string not found in input
>>>> // CHECK: \"store\": [\l \{ \"cluster\": \"t\", \"items\": [\l \{ \"kind\": \"Default\", \"offset\": 0, \"value\": \"conj_$3\{int, LC3, no stmt, #1\}\"
>>>>
>>>> Running locally, it fails after 2-5 runs for me, running:
>>>> python bin/llvm-lit.py -v ../clang/test/Analysis/dump_egraph.cpp
>>>>
>>>> Please could you take a look?
>>>>
>>>> Note that I'm not certain it was this commit that started the flakiness, it is the latest which changed the failing line.
>>>>
>>>> Thanks
>>>> Russ
>>>>
>>>> On Wed, 29 May 2019 at 19:02, Csaba Dabis via cfe-commits <cfe-commits at lists.llvm.org> wrote:
>>>>>
>>>>> Author: charusso
>>>>> Date: Wed May 29 11:05:53 2019
>>>>> New Revision: 361997
>>>>>
>>>>> URL: http://llvm.org/viewvc/llvm-project?rev=361997&view=rev
>>>>> Log:
>>>>> [analyzer] print() JSONify: getNodeLabel implementation
>>>>>
>>>>> Summary: This patch also rewrites the ProgramPoint printing.
>>>>>
>>>>> Reviewers: NoQ, xazax.hun, ravikandhadai, baloghadamsoftware, Szelethus
>>>>>
>>>>> Reviewed By: NoQ
>>>>>
>>>>> Subscribers: cfe-commits, szepet, rnkovacs, a.sidorin, mikhail.ramalho,
>>>>> donat.nagy, dkrupp
>>>>>
>>>>> Tags: #clang
>>>>>
>>>>> Differential Revision: https://reviews.llvm.org/D62346
>>>>>
>>>>> Modified:
>>>>> cfe/trunk/include/clang/Analysis/ProgramPoint.h
>>>>> cfe/trunk/lib/Analysis/ProgramPoint.cpp
>>>>> cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
>>>>> cfe/trunk/test/Analysis/dump_egraph.c
>>>>> cfe/trunk/test/Analysis/dump_egraph.cpp
>>>>>
>>>>> Modified: cfe/trunk/include/clang/Analysis/ProgramPoint.h
>>>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/ProgramPoint.h?rev=361997&r1=361996&r2=361997&view=diff
>>>>> ==============================================================================
>>>>> --- cfe/trunk/include/clang/Analysis/ProgramPoint.h (original)
>>>>> +++ cfe/trunk/include/clang/Analysis/ProgramPoint.h Wed May 29 11:05:53 2019
>>>>> @@ -213,7 +213,7 @@ public:
>>>>> ID.AddPointer(getTag());
>>>>> }
>>>>>
>>>>> - void print(StringRef CR, llvm::raw_ostream &Out) const;
>>>>> + void printJson(llvm::raw_ostream &Out, const char *NL = "\n") const;
>>>>>
>>>>> LLVM_DUMP_METHOD void dump() const;
>>>>>
>>>>>
>>>>> Modified: cfe/trunk/lib/Analysis/ProgramPoint.cpp
>>>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/ProgramPoint.cpp?rev=361997&r1=361996&r2=361997&view=diff
>>>>> ==============================================================================
>>>>> --- cfe/trunk/lib/Analysis/ProgramPoint.cpp (original)
>>>>> +++ cfe/trunk/lib/Analysis/ProgramPoint.cpp Wed May 29 11:05:53 2019
>>>>> @@ -43,151 +43,152 @@ ProgramPoint ProgramPoint::getProgramPoi
>>>>> }
>>>>>
>>>>> LLVM_DUMP_METHOD void ProgramPoint::dump() const {
>>>>> - return print(/*CR=*/"\n", llvm::errs());
>>>>> + return printJson(llvm::errs());
>>>>> }
>>>>>
>>>>> -static void printLocation(raw_ostream &Out, SourceLocation SLoc,
>>>>> - const SourceManager &SM,
>>>>> - StringRef CR,
>>>>> - StringRef Postfix) {
>>>>> - if (SLoc.isFileID()) {
>>>>> - Out << CR << "line=" << SM.getExpansionLineNumber(SLoc)
>>>>> - << " col=" << SM.getExpansionColumnNumber(SLoc) << Postfix;
>>>>> +static void printLocation(raw_ostream &Out, SourceLocation Loc,
>>>>> + const SourceManager &SM) {
>>>>> + Out << "\"location\": ";
>>>>> + if (!Loc.isFileID()) {
>>>>> + Out << "null";
>>>>> + return;
>>>>> }
>>>>> +
>>>>> + Out << "{ \"line\": " << SM.getExpansionLineNumber(Loc)
>>>>> + << ", \"column\": " << SM.getExpansionColumnNumber(Loc) << " }";
>>>>> }
>>>>>
>>>>> -void ProgramPoint::print(StringRef CR, llvm::raw_ostream &Out) const {
>>>>> +void ProgramPoint::printJson(llvm::raw_ostream &Out, const char *NL) const {
>>>>> const ASTContext &Context =
>>>>> getLocationContext()->getAnalysisDeclContext()->getASTContext();
>>>>> const SourceManager &SM = Context.getSourceManager();
>>>>> +
>>>>> + Out << "\"kind\": \"";
>>>>> switch (getKind()) {
>>>>> case ProgramPoint::BlockEntranceKind:
>>>>> - Out << "Block Entrance: B"
>>>>> + Out << "BlockEntrance\""
>>>>> + << ", \"block_id\": "
>>>>> << castAs<BlockEntrance>().getBlock()->getBlockID();
>>>>> break;
>>>>>
>>>>> case ProgramPoint::FunctionExitKind: {
>>>>> auto FEP = getAs<FunctionExitPoint>();
>>>>> - Out << "Function Exit: B" << FEP->getBlock()->getBlockID();
>>>>> + Out << "FunctionExit\""
>>>>> + << ", \"block_id\": " << FEP->getBlock()->getBlockID()
>>>>> + << ", \"stmt_id\": ";
>>>>> +
>>>>> if (const ReturnStmt *RS = FEP->getStmt()) {
>>>>> - Out << CR << " Return: S" << RS->getID(Context) << CR;
>>>>> - RS->printPretty(Out, /*helper=*/nullptr, Context.getPrintingPolicy(),
>>>>> - /*Indentation=*/2, /*NewlineSymbol=*/CR);
>>>>> + Out << RS->getID(Context) << ", \"stmt\": \"";
>>>>> + RS->printPretty(Out, /*Helper=*/nullptr, Context.getPrintingPolicy());
>>>>> + Out << '\"';
>>>>> + } else {
>>>>> + Out << "null, \"stmt\": null";
>>>>> }
>>>>> break;
>>>>> }
>>>>> case ProgramPoint::BlockExitKind:
>>>>> - assert(false);
>>>>> + llvm_unreachable("BlockExitKind");
>>>>> break;
>>>>> -
>>>>> case ProgramPoint::CallEnterKind:
>>>>> - Out << "CallEnter";
>>>>> + Out << "CallEnter\"";
>>>>> break;
>>>>> -
>>>>> case ProgramPoint::CallExitBeginKind:
>>>>> - Out << "CallExitBegin";
>>>>> + Out << "CallExitBegin\"";
>>>>> break;
>>>>> -
>>>>> case ProgramPoint::CallExitEndKind:
>>>>> - Out << "CallExitEnd";
>>>>> + Out << "CallExitEnd\"";
>>>>> break;
>>>>> -
>>>>> case ProgramPoint::PostStmtPurgeDeadSymbolsKind:
>>>>> - Out << "PostStmtPurgeDeadSymbols";
>>>>> + Out << "PostStmtPurgeDeadSymbols\"";
>>>>> break;
>>>>> -
>>>>> case ProgramPoint::PreStmtPurgeDeadSymbolsKind:
>>>>> - Out << "PreStmtPurgeDeadSymbols";
>>>>> + Out << "PreStmtPurgeDeadSymbols\"";
>>>>> break;
>>>>> -
>>>>> case ProgramPoint::EpsilonKind:
>>>>> - Out << "Epsilon Point";
>>>>> + Out << "EpsilonPoint\"";
>>>>> break;
>>>>>
>>>>> - case ProgramPoint::LoopExitKind: {
>>>>> - LoopExit LE = castAs<LoopExit>();
>>>>> - Out << "LoopExit: " << LE.getLoopStmt()->getStmtClassName();
>>>>> + case ProgramPoint::LoopExitKind:
>>>>> + Out << "LoopExit\", \"stmt\": \""
>>>>> + << castAs<LoopExit>().getLoopStmt()->getStmtClassName() << '\"';
>>>>> break;
>>>>> - }
>>>>>
>>>>> case ProgramPoint::PreImplicitCallKind: {
>>>>> ImplicitCallPoint PC = castAs<ImplicitCallPoint>();
>>>>> - Out << "PreCall: ";
>>>>> + Out << "PreCall\", \"stmt\": \"";
>>>>> PC.getDecl()->print(Out, Context.getLangOpts());
>>>>> - printLocation(Out, PC.getLocation(), SM, CR, /*Postfix=*/CR);
>>>>> + Out << "\", ";
>>>>> + printLocation(Out, PC.getLocation(), SM);
>>>>> break;
>>>>> }
>>>>>
>>>>> case ProgramPoint::PostImplicitCallKind: {
>>>>> ImplicitCallPoint PC = castAs<ImplicitCallPoint>();
>>>>> - Out << "PostCall: ";
>>>>> + Out << "PostCall\", \"stmt\": \"";
>>>>> PC.getDecl()->print(Out, Context.getLangOpts());
>>>>> - printLocation(Out, PC.getLocation(), SM, CR, /*Postfix=*/CR);
>>>>> + Out << "\", ";
>>>>> + printLocation(Out, PC.getLocation(), SM);
>>>>> break;
>>>>> }
>>>>>
>>>>> case ProgramPoint::PostInitializerKind: {
>>>>> - Out << "PostInitializer: ";
>>>>> + Out << "PostInitializer\", ";
>>>>> const CXXCtorInitializer *Init = castAs<PostInitializer>().getInitializer();
>>>>> - if (const FieldDecl *FD = Init->getAnyMember())
>>>>> - Out << *FD;
>>>>> - else {
>>>>> + if (const FieldDecl *FD = Init->getAnyMember()) {
>>>>> + Out << "\"field_decl\": \"" << *FD << '\"';
>>>>> + } else {
>>>>> + Out << "\"type\": \"";
>>>>> QualType Ty = Init->getTypeSourceInfo()->getType();
>>>>> Ty = Ty.getLocalUnqualifiedType();
>>>>> Ty.print(Out, Context.getLangOpts());
>>>>> + Out << '\"';
>>>>> }
>>>>> break;
>>>>> }
>>>>>
>>>>> case ProgramPoint::BlockEdgeKind: {
>>>>> const BlockEdge &E = castAs<BlockEdge>();
>>>>> - Out << "Edge: (B" << E.getSrc()->getBlockID() << ", B"
>>>>> - << E.getDst()->getBlockID() << ')';
>>>>> -
>>>>> - if (const Stmt *T = E.getSrc()->getTerminatorStmt()) {
>>>>> - SourceLocation SLoc = T->getBeginLoc();
>>>>> -
>>>>> - Out << "\\|Terminator: ";
>>>>> - E.getSrc()->printTerminator(Out, Context.getLangOpts());
>>>>> - printLocation(Out, SLoc, SM, CR, /*Postfix=*/"");
>>>>> -
>>>>> - if (isa<SwitchStmt>(T)) {
>>>>> - const Stmt *Label = E.getDst()->getLabel();
>>>>> -
>>>>> - if (Label) {
>>>>> - if (const auto *C = dyn_cast<CaseStmt>(Label)) {
>>>>> - Out << CR << "case ";
>>>>> - if (C->getLHS())
>>>>> - C->getLHS()->printPretty(
>>>>> - Out, nullptr, Context.getPrintingPolicy(),
>>>>> - /*Indentation=*/0, /*NewlineSymbol=*/CR);
>>>>> -
>>>>> - if (const Stmt *RHS = C->getRHS()) {
>>>>> - Out << " .. ";
>>>>> - RHS->printPretty(Out, nullptr, Context.getPrintingPolicy(),
>>>>> - /*Indetation=*/0, /*NewlineSymbol=*/CR);
>>>>> - }
>>>>> -
>>>>> - Out << ":";
>>>>> - } else {
>>>>> - assert(isa<DefaultStmt>(Label));
>>>>> - Out << CR << "default:";
>>>>> - }
>>>>> - } else
>>>>> - Out << CR << "(implicit) default:";
>>>>> - } else if (isa<IndirectGotoStmt>(T)) {
>>>>> - // FIXME
>>>>> + const Stmt *T = E.getSrc()->getTerminatorStmt();
>>>>> + Out << "Edge\", \"src_id\": " << E.getSrc()->getBlockID()
>>>>> + << ", \"dst_id\": " << E.getDst()->getBlockID()
>>>>> + << ", \"terminator\": " << (!T ? "null, \"term_kind\": null" : "\"");
>>>>> + if (!T)
>>>>> + break;
>>>>> +
>>>>> + E.getSrc()->printTerminator(Out, Context.getLangOpts());
>>>>> + Out << "\", ";
>>>>> + printLocation(Out, T->getBeginLoc(), SM);
>>>>> + Out << ", \"term_kind\": \"";
>>>>> +
>>>>> + if (isa<SwitchStmt>(T)) {
>>>>> + Out << "SwitchStmt\", \"case\": ";
>>>>> + if (const Stmt *Label = E.getDst()->getLabel()) {
>>>>> + if (const auto *C = dyn_cast<CaseStmt>(Label)) {
>>>>> + Out << "{ \"lhs\": ";
>>>>> + if (const Stmt *LHS = C->getLHS())
>>>>> + LHS->printPretty(Out, nullptr, Context.getPrintingPolicy());
>>>>> + else
>>>>> + Out << "null";
>>>>> + Out << ", \"rhs\": ";
>>>>> + if (const Stmt *RHS = C->getRHS())
>>>>> + RHS->printPretty(Out, nullptr, Context.getPrintingPolicy());
>>>>> + else
>>>>> + Out << "null";
>>>>> + Out << " }";
>>>>> + } else {
>>>>> + assert(isa<DefaultStmt>(Label));
>>>>> + Out << "\"default\"";
>>>>> + }
>>>>> } else {
>>>>> - Out << CR << "Condition: ";
>>>>> - if (*E.getSrc()->succ_begin() == E.getDst())
>>>>> - Out << "true";
>>>>> - else
>>>>> - Out << "false";
>>>>> + Out << "\"implicit default\"";
>>>>> }
>>>>> -
>>>>> - Out << CR;
>>>>> + } else if (isa<IndirectGotoStmt>(T)) {
>>>>> + // FIXME: More info.
>>>>> + Out << "IndirectGotoStmt\"";
>>>>> + } else {
>>>>> + Out << "Condition\", \"value\": "
>>>>> + << (*E.getSrc()->succ_begin() == E.getDst() ? "true" : "false");
>>>>> }
>>>>> -
>>>>> break;
>>>>> }
>>>>>
>>>>> @@ -195,22 +196,37 @@ void ProgramPoint::print(StringRef CR, l
>>>>> const Stmt *S = 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=*/CR);
>>>>> - printLocation(Out, S->getBeginLoc(), SM, CR, /*Postfix=*/"");
>>>>> + llvm::SmallString<256> TempBuf;
>>>>> + llvm::raw_svector_ostream TempOut(TempBuf);
>>>>> +
>>>>> + Out << "Statement\", \"stmt_kind\": \"" << S->getStmtClassName()
>>>>> + << "\", \"stmt_id\": " << S->getID(Context)
>>>>> + << ", \"pointer\": \"" << (const void *)S << "\", \"pretty\": ";
>>>>> +
>>>>> + // See whether the current statement is pretty-printable.
>>>>> + S->printPretty(TempOut, /*Helper=*/nullptr, Context.getPrintingPolicy());
>>>>> + if (!TempBuf.empty()) {
>>>>> + Out << '\"' << TempBuf.str().trim() << "\", ";
>>>>> + TempBuf.clear();
>>>>> + } else {
>>>>> + Out << "null, ";
>>>>> + }
>>>>> +
>>>>> + printLocation(Out, S->getBeginLoc(), SM);
>>>>>
>>>>> + Out << ", \"stmt_point_kind\": ";
>>>>> if (getAs<PreStmt>())
>>>>> - Out << CR << "PreStmt" << CR;
>>>>> + Out << "\"PreStmt\"";
>>>>> else if (getAs<PostLoad>())
>>>>> - Out << CR << "PostLoad" << CR;
>>>>> + Out << "\"PostLoad\"";
>>>>> else if (getAs<PostStore>())
>>>>> - Out << CR << "PostStore" << CR;
>>>>> + Out << "\"PostStore\"";
>>>>> else if (getAs<PostLValue>())
>>>>> - Out << CR << "PostLValue" << CR;
>>>>> + Out << "\"PostLValue\"";
>>>>> else if (getAs<PostAllocatorCall>())
>>>>> - Out << CR << "PostAllocatorCall" << CR;
>>>>> + Out << "\"PostAllocatorCall\"";
>>>>> + else
>>>>> + Out << "null";
>>>>>
>>>>> break;
>>>>> }
>>>>>
>>>>> Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
>>>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp?rev=361997&r1=361996&r2=361997&view=diff
>>>>> ==============================================================================
>>>>> --- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp (original)
>>>>> +++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp Wed May 29 11:05:53 2019
>>>>> @@ -162,12 +162,12 @@ public:
>>>>> << "\", \"argument_index\": ";
>>>>>
>>>>> if (getItem().getKind() == ConstructionContextItem::ArgumentKind)
>>>>> - Out << getItem().getIndex() << '\"';
>>>>> + Out << getItem().getIndex();
>>>>> else
>>>>> Out << "null";
>>>>>
>>>>> // Pretty-print
>>>>> - Out << ", \"pretty\": \"";
>>>>> + Out << ", \"pretty\": ";
>>>>>
>>>>> if (S) {
>>>>> llvm::SmallString<256> TempBuf;
>>>>> @@ -176,13 +176,13 @@ public:
>>>>> // See whether the current statement is pretty-printable.
>>>>> S->printPretty(TempOut, Helper, PP);
>>>>> if (!TempBuf.empty()) {
>>>>> - Out << TempBuf.str().trim() << '\"';
>>>>> + Out << '\"' << TempBuf.str().trim() << '\"';
>>>>> TempBuf.clear();
>>>>> } else {
>>>>> Out << "null";
>>>>> }
>>>>> } else {
>>>>> - Out << I->getAnyMember()->getNameAsString() << '\"';
>>>>> + Out << '\"' << I->getAnyMember()->getNameAsString() << '\"';
>>>>> }
>>>>> }
>>>>>
>>>>> @@ -3079,37 +3079,55 @@ struct DOTGraphTraits<ExplodedGraph*> :
>>>>> }
>>>>>
>>>>> static std::string getNodeLabel(const ExplodedNode *N, ExplodedGraph *G){
>>>>> - std::string sbuf;
>>>>> - llvm::raw_string_ostream Out(sbuf);
>>>>> + std::string Buf;
>>>>> + llvm::raw_string_ostream Out(Buf);
>>>>>
>>>>> + const bool IsDot = true;
>>>>> + const unsigned int Space = 1;
>>>>> ProgramStateRef State = N->getState();
>>>>>
>>>>> + Out << "{ \"node_id\": \"" << (const void *)N
>>>>> + << "\", \"state_id\": " << State->getID()
>>>>> + << ", \"has_report\": " << (nodeHasBugReport(N) ? "true" : "false")
>>>>> + << ",\\l";
>>>>> +
>>>>> + Indent(Out, Space, IsDot) << "\"program_points\": [\\l";
>>>>> +
>>>>> // Dump program point for all the previously skipped nodes.
>>>>> traverseHiddenNodes(
>>>>> N,
>>>>> [&](const ExplodedNode *OtherNode) {
>>>>> - OtherNode->getLocation().print(/*CR=*/"\\l", Out);
>>>>> + Indent(Out, Space + 1, IsDot) << "{ ";
>>>>> + OtherNode->getLocation().printJson(Out, /*NL=*/"\\l");
>>>>> + Out << ", \"tag\": ";
>>>>> if (const ProgramPointTag *Tag = OtherNode->getLocation().getTag())
>>>>> - Out << "\\lTag:" << Tag->getTagDescription();
>>>>> - if (N->isSink())
>>>>> - Out << "\\lNode is sink\\l";
>>>>> - if (nodeHasBugReport(N))
>>>>> - Out << "\\lBug report attached\\l";
>>>>> + Out << '\"' << Tag->getTagDescription() << "\" }";
>>>>> + else
>>>>> + Out << "null }";
>>>>> },
>>>>> - [&](const ExplodedNode *) { Out << "\\l--------\\l"; },
>>>>> + // Adds a comma and a new-line between each program point.
>>>>> + [&](const ExplodedNode *) { Out << ",\\l"; },
>>>>> [&](const ExplodedNode *) { return false; });
>>>>>
>>>>> - Out << "\\l\\|";
>>>>> -
>>>>> - Out << "StateID: ST" << State->getID() << ", NodeID: N" << N->getID(G)
>>>>> - << " <" << (const void *)N << ">\\|";
>>>>> + Out << "\\l"; // Adds a new-line to the last program point.
>>>>> + Indent(Out, Space, IsDot) << "],\\l";
>>>>>
>>>>> bool SameAsAllPredecessors =
>>>>> std::all_of(N->pred_begin(), N->pred_end(), [&](const ExplodedNode *P) {
>>>>> return P->getState() == State;
>>>>> });
>>>>> - if (!SameAsAllPredecessors)
>>>>> - State->printDOT(Out, N->getLocationContext());
>>>>> +
>>>>> + if (!SameAsAllPredecessors) {
>>>>> + State->printDOT(Out, N->getLocationContext(), Space);
>>>>> + } else {
>>>>> + Indent(Out, Space, IsDot) << "\"program_state\": null";
>>>>> + }
>>>>> +
>>>>> + Out << "\\l}";
>>>>> + if (!N->succ_empty())
>>>>> + Out << ',';
>>>>> + Out << "\\l";
>>>>> +
>>>>> return Out.str();
>>>>> }
>>>>> };
>>>>>
>>>>> Modified: cfe/trunk/test/Analysis/dump_egraph.c
>>>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/dump_egraph.c?rev=361997&r1=361996&r2=361997&view=diff
>>>>> ==============================================================================
>>>>> --- cfe/trunk/test/Analysis/dump_egraph.c (original)
>>>>> +++ cfe/trunk/test/Analysis/dump_egraph.c Wed May 29 11:05:53 2019
>>>>> @@ -11,6 +11,10 @@ int foo() {
>>>>> }
>>>>>
>>>>> // CHECK: digraph "Exploded Graph" {
>>>>> -// CHECK: Edge: (B2, B1)
>>>>> -// CHECK: Block Entrance: B1
>>>>> -// CHECK: Bug report attached
>>>>> +
>>>>> +// CHECK: \"program_points\": [\l \{ \"kind\": \"Edge\", \"src_id\": 2, \"dst_id\": 1, \"terminator\": null, \"term_kind\": null, \"tag\": null \}\l ],\l \"program_state\": null
>>>>> +
>>>>> +// CHECK: \"program_points\": [\l \{ \"kind\": \"BlockEntrance\", \"block_id\": 1
>>>>> +
>>>>> +// CHECK: \"has_report\": true
>>>>> +
>>>>>
>>>>> Modified: cfe/trunk/test/Analysis/dump_egraph.cpp
>>>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/dump_egraph.cpp?rev=361997&r1=361996&r2=361997&view=diff
>>>>> ==============================================================================
>>>>> --- cfe/trunk/test/Analysis/dump_egraph.cpp (original)
>>>>> +++ cfe/trunk/test/Analysis/dump_egraph.cpp Wed May 29 11:05:53 2019
>>>>> @@ -16,9 +16,9 @@ void foo() {
>>>>> T t;
>>>>> }
>>>>>
>>>>> -// CHECK: \"constructing_objects\": [\l \{ \"location_context\": \"#0 Call\", \"calling\": \"foo\", \"call_line\": null, \"items\": [\l \{ \"lctx_id\": 1, \"stmt_id\": 1155, \"kind\": \"construct into local variable\", \"argument_index\": null, \"pretty\": \"T t;\", \"value\": \"&t\"
>>>>> +// CHECK: \"constructing_objects\": [\l \{ \"location_context\": \"#0 Call\", \"calling\": \"foo\", \"call_line\": null, \"items\": [\l \{ \"lctx_id\": 1, \"stmt_id\": 1155, \"kind\": \"construct into local variable\", \"argument_index\": null, \"pretty\": \"T t;\", \"value\": \"&t\"
>>>>>
>>>>> -// CHECK: \"constructing_objects\": [\l \{ \"location_context\": \"#0 Call\", \"calling\": \"T::T\", \"call_line\": \"16\", \"items\": [\l \{ \"lctx_id\": 2, \"init_id\": 1092, \"kind\": \"construct into member variable\", \"argument_index\": null, \"pretty\": \"s\", \"value\": \"&t-\>s\"
>>>>> +// CHECK: \"constructing_objects\": [\l \{ \"location_context\": \"#0 Call\", \"calling\": \"T::T\", \"call_line\": \"16\", \"items\": [\l \{ \"lctx_id\": 2, \"init_id\": 1092, \"kind\": \"construct into member variable\", \"argument_index\": null, \"pretty\": \"s\", \"value\": \"&t-\>s\"
>>>>>
>>>>> -// CHECK: \"store\": [\l \{ \"cluster\": \"t\", \"items\": [\l \{ \"kind\": \"Default\", \"offset\": 0, \"value\": \"conj_$3\{int, LC3, no stmt, #1\}\"
>>>>> +// CHECK: \"store\": [\l \{ \"cluster\": \"t\", \"items\": [\l \{ \"kind\": \"Default\", \"offset\": 0, \"value\": \"conj_$3\{int, LC3, no stmt, #1\}\"
>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> cfe-commits mailing list
>>>>> cfe-commits at lists.llvm.org
>>>>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list