[clang] [llvm] [clang][ssaf] Add CallGraph summary and extractor (PR #188753)

Balázs Benics via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 31 05:58:44 PDT 2026


================
@@ -0,0 +1,106 @@
+//===- CallGraphExtractor.cpp - Call Graph Summary Extractor --------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/AST/ASTContext.h"
+#include "clang/AST/Decl.h"
+#include "clang/AST/DeclCXX.h"
+#include "clang/AST/DeclObjC.h"
+#include "clang/Analysis/AnalysisDeclContext.h"
+#include "clang/Analysis/CallGraph.h"
+#include "clang/Basic/SourceManager.h"
+#include "clang/ScalableStaticAnalysisFramework/Analyses/CallGraph/CallGraphSummary.h"
+#include "clang/ScalableStaticAnalysisFramework/Core/ASTEntityMapping.h"
+#include "clang/ScalableStaticAnalysisFramework/Core/TUSummary/ExtractorRegistry.h"
+#include "clang/ScalableStaticAnalysisFramework/Core/TUSummary/TUSummaryBuilder.h"
+#include "llvm/ADT/STLExtras.h"
+#include <memory>
+
+using namespace clang;
+using namespace ssaf;
+
+namespace {
+class CallGraphExtractor final : public TUSummaryExtractor {
+public:
+  using TUSummaryExtractor::TUSummaryExtractor;
+
+private:
+  void HandleTranslationUnit(ASTContext &Ctx) override;
+
+  void handleCallGraphNode(const ASTContext &Ctx, const CallGraphNode *N);
+};
+} // namespace
+
+void CallGraphExtractor::HandleTranslationUnit(ASTContext &Ctx) {
+  CallGraph CG;
+  CG.addToCallGraph(
+      const_cast<TranslationUnitDecl *>(Ctx.getTranslationUnitDecl()));
+
+  for (const auto &N : llvm::make_second_range(CG)) {
+    if (N && N->getDecl() && N->getDefinition())
+      handleCallGraphNode(Ctx, N.get());
+  }
+}
+
+void CallGraphExtractor::handleCallGraphNode(const ASTContext &Ctx,
+                                             const CallGraphNode *N) {
+  const FunctionDecl *Definition = N->getDefinition();
+
+  // CallGraph does not work for primary templates.
----------------
steakhal wrote:

```suggestion
  // FIXME: `clang::CallGraph` does not create entries for primary templates.
```

https://github.com/llvm/llvm-project/pull/188753


More information about the llvm-commits mailing list