Author: Martin Braenne Date: 2023-08-03T06:59:29Z New Revision: e6cd409fc6396cb13c59b4a5190abc4b856f22a5
URL: https://github.com/llvm/llvm-project/commit/e6cd409fc6396cb13c59b4a5190abc4b856f22a5 DIFF: https://github.com/llvm/llvm-project/commit/e6cd409fc6396cb13c59b4a5190abc4b856f22a5.diff LOG: [clang][dataflow] In `ControlFlowContext`, handle `Decl` by reference instead of pointer. `build()` guarantees that we'll always have a `Decl`, so we can simplify the code. Reviewed By: ymandel, xazax.hun Differential Revision: https://reviews.llvm.org/D156859 Added: Modified: clang/include/clang/Analysis/FlowSensitive/ControlFlowContext.h clang/lib/Analysis/FlowSensitive/ControlFlowContext.cpp clang/lib/Analysis/FlowSensitive/HTMLLogger.cpp clang/lib/Analysis/FlowSensitive/Logger.cpp clang/lib/Analysis/FlowSensitive/Transfer.cpp clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Analysis/FlowSensitive/ControlFlowContext.h b/clang/include/clang/Analysis/FlowSensitive/ControlFlowContext.h index bb36ed237c1e34..a45bb0635a2f36 100644 --- a/clang/include/clang/Analysis/FlowSensitive/ControlFlowContext.h +++ b/clang/include/clang/Analysis/FlowSensitive/ControlFlowContext.h @@ -48,7 +48,7 @@ class ControlFlowContext { /// Returns the `Decl` containing the statement used to construct the CFG, if /// available. - const Decl *getDecl() const { return ContainingDecl; } + const Decl &getDecl() const { return ContainingDecl; } /// Returns the CFG that is stored in this context. const CFG &getCFG() const { return *Cfg; } @@ -64,9 +64,7 @@ class ControlFlowContext { } private: - // FIXME: Once the deprecated `build` method is removed, mark `D` as "must not - // be null" and add an assertion. - ControlFlowContext(const Decl *D, std::unique_ptr<CFG> Cfg, + ControlFlowContext(const Decl &D, std::unique_ptr<CFG> Cfg, llvm::DenseMap<const Stmt *, const CFGBlock *> StmtToBlock, llvm::BitVector BlockReachable) : ContainingDecl(D), Cfg(std::move(Cfg)), @@ -74,7 +72,7 @@ class ControlFlowContext { BlockReachable(std::move(BlockReachable)) {} /// The `Decl` containing the statement used to construct the CFG. - const Decl *ContainingDecl; + const Decl &ContainingDecl; std::unique_ptr<CFG> Cfg; llvm::DenseMap<const Stmt *, const CFGBlock *> StmtToBlock; llvm::BitVector BlockReachable; diff --git a/clang/lib/Analysis/FlowSensitive/ControlFlowContext.cpp b/clang/lib/Analysis/FlowSensitive/ControlFlowContext.cpp index c80525dc4f34f2..d5e0b443caf301 100644 --- a/clang/lib/Analysis/FlowSensitive/ControlFlowContext.cpp +++ b/clang/lib/Analysis/FlowSensitive/ControlFlowContext.cpp @@ -105,7 +105,7 @@ ControlFlowContext::build(const Decl &D, Stmt &S, ASTContext &C) { llvm::BitVector BlockReachable = findReachableBlocks(*Cfg); - return ControlFlowContext(&D, std::move(Cfg), std::move(StmtToBlock), + return ControlFlowContext(D, std::move(Cfg), std::move(StmtToBlock), std::move(BlockReachable)); } diff --git a/clang/lib/Analysis/FlowSensitive/HTMLLogger.cpp b/clang/lib/Analysis/FlowSensitive/HTMLLogger.cpp index 9ec0160b1e3fe4..b1bfe10db20243 100644 --- a/clang/lib/Analysis/FlowSensitive/HTMLLogger.cpp +++ b/clang/lib/Analysis/FlowSensitive/HTMLLogger.cpp @@ -166,15 +166,14 @@ class HTMLLogger : public Logger { this->CFG = &CFG; *OS << llvm::StringRef(HTMLLogger_html).split("<?INJECT?>").first; - if (const auto *D = CFG.getDecl()) { - const auto &SM = A.getASTContext().getSourceManager(); - *OS << "<title>"; - if (const auto *ND = dyn_cast<NamedDecl>(D)) - *OS << ND->getNameAsString() << " at "; - *OS << SM.getFilename(D->getLocation()) << ":" - << SM.getSpellingLineNumber(D->getLocation()); - *OS << "</title>\n"; - }; + const auto &D = CFG.getDecl(); + const auto &SM = A.getASTContext().getSourceManager(); + *OS << "<title>"; + if (const auto *ND = dyn_cast<NamedDecl>(&D)) + *OS << ND->getNameAsString() << " at "; + *OS << SM.getFilename(D.getLocation()) << ":" + << SM.getSpellingLineNumber(D.getLocation()); + *OS << "</title>\n"; *OS << "<style>" << HTMLLogger_css << "</style>\n"; *OS << "<script>" << HTMLLogger_js << "</script>\n"; @@ -307,9 +306,7 @@ class HTMLLogger : public Logger { // tokens are associated with, and even which BB element (so that clicking // can select the right element). void writeCode() { - if (!CFG->getDecl()) - return; - const auto &AST = CFG->getDecl()->getASTContext(); + const auto &AST = CFG->getDecl().getASTContext(); bool Invalid = false; // Extract the source code from the original file. @@ -317,7 +314,7 @@ class HTMLLogger : public Logger { // indentation to worry about), but we need the boundaries of particular // AST nodes and the printer doesn't provide this. auto Range = clang::Lexer::makeFileCharRange( - CharSourceRange::getTokenRange(CFG->getDecl()->getSourceRange()), + CharSourceRange::getTokenRange(CFG->getDecl().getSourceRange()), AST.getSourceManager(), AST.getLangOpts()); if (Range.isInvalid()) return; diff --git a/clang/lib/Analysis/FlowSensitive/Logger.cpp b/clang/lib/Analysis/FlowSensitive/Logger.cpp index 469fea338e451d..28557638522e8f 100644 --- a/clang/lib/Analysis/FlowSensitive/Logger.cpp +++ b/clang/lib/Analysis/FlowSensitive/Logger.cpp @@ -39,11 +39,10 @@ struct TextualLogger final : Logger { llvm::WithColor Header(OS, llvm::raw_ostream::Colors::RED, /*Bold=*/true); OS << "=== Beginning data flow analysis ===\n"; } - if (auto *D = CFG.getDecl()) { - D->print(OS); - OS << "\n"; - D->dump(OS); - } + auto &D = CFG.getDecl(); + D.print(OS); + OS << "\n"; + D.dump(OS); CurrentCFG = &CFG.getCFG(); CurrentCFG->print(OS, Analysis.getASTContext().getLangOpts(), ShowColors); CurrentAnalysis = &Analysis; diff --git a/clang/lib/Analysis/FlowSensitive/Transfer.cpp b/clang/lib/Analysis/FlowSensitive/Transfer.cpp index d5da879d1bed2a..8617cf4c8ca4a2 100644 --- a/clang/lib/Analysis/FlowSensitive/Transfer.cpp +++ b/clang/lib/Analysis/FlowSensitive/Transfer.cpp @@ -725,9 +725,7 @@ class TransferVisitor : public ConstStmtVisitor<TransferVisitor> { // FIXME: Use the same analysis as the caller for the callee. Note, // though, that doing so would require support for changing the analysis's // ASTContext. - assert(CFCtx->getDecl() != nullptr && - "ControlFlowContexts in the environment should always carry a decl"); - auto Analysis = NoopAnalysis(CFCtx->getDecl()->getASTContext(), + auto Analysis = NoopAnalysis(CFCtx->getDecl().getASTContext(), DataflowAnalysisOptions{Options}); auto BlockToOutputState = diff --git a/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp b/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp index e0c4991ca1a45d..e37d86cb6ba4ee 100644 --- a/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp +++ b/clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp @@ -189,7 +189,7 @@ class PrettyStackTraceAnalysis : public llvm::PrettyStackTraceEntry { void print(raw_ostream &OS) const override { OS << Message << "\n"; OS << "Decl:\n"; - CFCtx.getDecl()->dump(OS); + CFCtx.getDecl().dump(OS); OS << "CFG:\n"; CFCtx.getCFG().print(OS, LangOptions(), false); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits