Skip to content

[LifetimeSafety] Improve Origin information in debug output #153951

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 34 additions & 14 deletions clang/lib/Analysis/LifetimeSafety.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,18 @@ class OriginManager {
return NewID;
}

void dump(OriginID OID, llvm::raw_ostream &OS) const {
OS << OID << " (";
Origin O = getOrigin(OID);
if (const ValueDecl *VD = O.getDecl())
OS << "Decl: " << VD->getNameAsString();
else if (const Expr *E = O.getExpr())
OS << "Expr: " << E->getStmtClassName();
else
OS << "Unknown";
OS << ")";
}

private:
OriginID getNextOriginID() { return NextOriginID++; }

Expand Down Expand Up @@ -222,7 +234,7 @@ class Fact {
return nullptr;
}

virtual void dump(llvm::raw_ostream &OS) const {
virtual void dump(llvm::raw_ostream &OS, const OriginManager &) const {
OS << "Fact (Kind: " << static_cast<int>(K) << ")\n";
}
};
Expand All @@ -237,9 +249,10 @@ class IssueFact : public Fact {
IssueFact(LoanID LID, OriginID OID) : Fact(Kind::Issue), LID(LID), OID(OID) {}
LoanID getLoanID() const { return LID; }
OriginID getOriginID() const { return OID; }
void dump(llvm::raw_ostream &OS) const override {
OS << "Issue (LoanID: " << getLoanID() << ", OriginID: " << getOriginID()
<< ")\n";
void dump(llvm::raw_ostream &OS, const OriginManager &OM) const override {
OS << "Issue (LoanID: " << getLoanID() << ", ToOrigin: ";
OM.dump(getOriginID(), OS);
OS << ")\n";
}
};

Expand All @@ -256,7 +269,7 @@ class ExpireFact : public Fact {
LoanID getLoanID() const { return LID; }
SourceLocation getExpiryLoc() const { return ExpiryLoc; }

void dump(llvm::raw_ostream &OS) const override {
void dump(llvm::raw_ostream &OS, const OriginManager &OM) const override {
OS << "Expire (LoanID: " << getLoanID() << ")\n";
}
};
Expand All @@ -274,9 +287,12 @@ class AssignOriginFact : public Fact {
: Fact(Kind::AssignOrigin), OIDDest(OIDDest), OIDSrc(OIDSrc) {}
OriginID getDestOriginID() const { return OIDDest; }
OriginID getSrcOriginID() const { return OIDSrc; }
void dump(llvm::raw_ostream &OS) const override {
OS << "AssignOrigin (DestID: " << getDestOriginID()
<< ", SrcID: " << getSrcOriginID() << ")\n";
void dump(llvm::raw_ostream &OS, const OriginManager &OM) const override {
OS << "AssignOrigin (Dest: ";
OM.dump(getDestOriginID(), OS);
OS << ", Src: ";
OM.dump(getSrcOriginID(), OS);
OS << ")\n";
}
};

Expand All @@ -290,8 +306,10 @@ class ReturnOfOriginFact : public Fact {

ReturnOfOriginFact(OriginID OID) : Fact(Kind::ReturnOfOrigin), OID(OID) {}
OriginID getReturnedOriginID() const { return OID; }
void dump(llvm::raw_ostream &OS) const override {
OS << "ReturnOfOrigin (OriginID: " << getReturnedOriginID() << ")\n";
void dump(llvm::raw_ostream &OS, const OriginManager &OM) const override {
OS << "ReturnOfOrigin (";
OM.dump(getReturnedOriginID(), OS);
OS << ")\n";
}
};

Expand All @@ -308,8 +326,10 @@ class UseFact : public Fact {
OriginID getUsedOrigin() const { return UsedOrigin; }
const Expr *getUseExpr() const { return UseExpr; }

void dump(llvm::raw_ostream &OS) const override {
OS << "Use (OriginID: " << UsedOrigin << ")\n";
void dump(llvm::raw_ostream &OS, const OriginManager &OM) const override {
OS << "Use (";
OM.dump(getUsedOrigin(), OS);
OS << ")\n";
}
};

Expand All @@ -326,7 +346,7 @@ class TestPointFact : public Fact {

StringRef getAnnotation() const { return Annotation; }

void dump(llvm::raw_ostream &OS) const override {
void dump(llvm::raw_ostream &OS, const OriginManager &) const override {
OS << "TestPoint (Annotation: \"" << getAnnotation() << "\")\n";
}
};
Expand Down Expand Up @@ -365,7 +385,7 @@ class FactManager {
if (It != BlockToFactsMap.end()) {
for (const Fact *F : It->second) {
llvm::dbgs() << " ";
F->dump(llvm::dbgs());
F->dump(llvm::dbgs(), OriginMgr);
}
}
llvm::dbgs() << " End of Block\n";
Expand Down
Loading