aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
diff options
context:
space:
mode:
authormartinboehme <mboehme@google.com>2024-01-31 08:11:13 +0100
committerGitHub <noreply@github.com>2024-01-31 08:11:13 +0100
commitc83ec847ac9d06fb4ad85ce3bc50d7a6b122ead2 (patch)
treec4fc11262128e39fbfdbf2c19aba2d899dffd8da /clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
parent95947465024e865a4a671e94902db40d250f0601 (diff)
downloadllvm-c83ec847ac9d06fb4ad85ce3bc50d7a6b122ead2.zip
llvm-c83ec847ac9d06fb4ad85ce3bc50d7a6b122ead2.tar.gz
llvm-c83ec847ac9d06fb4ad85ce3bc50d7a6b122ead2.tar.bz2
[clang][dataflow] Extend debug output for `Environment`. (#79982)
* Print `ReturnLoc`, `ReturnVal`, and `ThisPointeeLoc` if applicable. * For entries in `LocToVal` that correspond to declarations, print the names of the declarations next to them. I've removed the FIXME because all relevant fields are now being dumped. I'm not sure we actually need the capability for the caller to specify which fields to dump, so I've simply deleted this part of the comment. Some examples of the output: ![image](https://github.com/llvm/llvm-project/assets/29098113/17d0978f-b86d-4555-8a61-d1f2021f8d59) ![image](https://github.com/llvm/llvm-project/assets/29098113/021dbb24-5fe2-4720-8a08-f48dcf4b88f8)
Diffstat (limited to 'clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp')
-rw-r--r--clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp36
1 files changed, 30 insertions, 6 deletions
diff --git a/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp b/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
index acb38e5..01db658 100644
--- a/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
+++ b/clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp
@@ -1009,12 +1009,15 @@ bool Environment::allows(const Formula &F) const {
}
void Environment::dump(raw_ostream &OS) const {
- // FIXME: add printing for remaining fields and allow caller to decide what
- // fields are printed.
- OS << "DeclToLoc:\n";
- for (auto [D, L] : DeclToLoc)
- OS << " [" << D->getNameAsString() << ", " << L << "]\n";
+ llvm::DenseMap<const StorageLocation *, std::string> LocToName;
+ if (ThisPointeeLoc != nullptr)
+ LocToName[ThisPointeeLoc] = "this";
+ OS << "DeclToLoc:\n";
+ for (auto [D, L] : DeclToLoc) {
+ auto Iter = LocToName.insert({L, D->getNameAsString()}).first;
+ OS << " [" << Iter->second << ", " << L << "]\n";
+ }
OS << "ExprToLoc:\n";
for (auto [E, L] : ExprToLoc)
OS << " [" << E << ", " << L << "]\n";
@@ -1025,7 +1028,28 @@ void Environment::dump(raw_ostream &OS) const {
OS << "LocToVal:\n";
for (auto [L, V] : LocToVal) {
- OS << " [" << L << ", " << V << ": " << *V << "]\n";
+ OS << " [" << L;
+ if (auto Iter = LocToName.find(L); Iter != LocToName.end())
+ OS << " (" << Iter->second << ")";
+ OS << ", " << V << ": " << *V << "]\n";
+ }
+
+ if (const FunctionDecl *Func = getCurrentFunc()) {
+ if (Func->getReturnType()->isReferenceType()) {
+ OS << "ReturnLoc: " << ReturnLoc;
+ if (auto Iter = LocToName.find(ReturnLoc); Iter != LocToName.end())
+ OS << " (" << Iter->second << ")";
+ OS << "\n";
+ } else if (!Func->getReturnType()->isVoidType()) {
+ if (ReturnVal == nullptr)
+ OS << "ReturnVal: nullptr\n";
+ else
+ OS << "ReturnVal: " << *ReturnVal << "\n";
+ }
+
+ if (isa<CXXMethodDecl>(Func)) {
+ OS << "ThisPointeeLoc: " << ThisPointeeLoc << "\n";
+ }
}
OS << "\n";