https://github.com/steakhal updated https://github.com/llvm/llvm-project/pull/185428
From 1882b71e904e67e410cb7b53c36c0f2690713394 Mon Sep 17 00:00:00 2001 From: Balazs Benics <[email protected]> Date: Thu, 5 Mar 2026 17:09:26 +0000 Subject: [PATCH 1/2] [clang][ssaf] Add --ssaf-list-{extractor,format} flags These flags only work with the `clang` driver. The `cc1` driver would ignore these flags. Probably it could be implemented differently, but it's already better than having nothing. --- .../user-docs/SummaryExtraction.rst | 4 +++ .../SerializationFormatRegistry.h | 4 +++ .../Scalable/TUSummary/ExtractorRegistry.h | 4 +++ .../include/clang/Frontend/FrontendOptions.h | 11 +++++++- clang/include/clang/Options/Options.td | 12 +++++++++ .../SerializationFormatRegistry.cpp | 6 +++++ .../Scalable/TUSummary/ExtractorRegistry.cpp | 6 +++++ clang/lib/Driver/CMakeLists.txt | 1 + clang/lib/Driver/Driver.cpp | 19 ++++++++++++++ clang/test/Analysis/SSAF/help.cpp | 26 ++++++++++++++----- 10 files changed, 86 insertions(+), 7 deletions(-) diff --git a/clang/docs/ScalableStaticAnalysisFramework/user-docs/SummaryExtraction.rst b/clang/docs/ScalableStaticAnalysisFramework/user-docs/SummaryExtraction.rst index f7472bfd8643a..96892cfa5fdea 100644 --- a/clang/docs/ScalableStaticAnalysisFramework/user-docs/SummaryExtraction.rst +++ b/clang/docs/ScalableStaticAnalysisFramework/user-docs/SummaryExtraction.rst @@ -13,6 +13,8 @@ Two flags control summary extraction: - ``--ssaf-extract-summaries=<name1>,<name2>,...``: Comma-separated list of summary extractor names to enable. - ``--ssaf-tu-summary-file=<path>.<format>``: Output file for the extracted summaries. The file extension selects the serialization format (e.g. ``.json``). +- ``--ssaf-list-extractors``: List the available summary extractors. +- ``--ssaf-list-formats``: List the available serialization formats. Example invocation: @@ -22,6 +24,8 @@ Example invocation: --ssaf-tu-summary-file=my-tu-summary.json \ -c input.cpp -o input.o + clang --ssaf-list-extractors --ssaf-list-formats + Diagnostics *********** diff --git a/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormatRegistry.h b/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormatRegistry.h index 7edd7b5b561d9..6e8ebabc1b742 100644 --- a/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormatRegistry.h +++ b/clang/include/clang/Analysis/Scalable/Serialization/SerializationFormatRegistry.h @@ -68,6 +68,7 @@ #include "clang/Support/Compiler.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/Registry.h" +#include "llvm/Support/raw_ostream.h" namespace clang::ssaf { @@ -80,6 +81,9 @@ bool isFormatRegistered(llvm::StringRef FormatName); /// It's a fatal error if there is no format registered with the name. std::unique_ptr<SerializationFormat> makeFormat(llvm::StringRef FormatName); +/// Print the list of available serialization formats. +void printAvailableFormats(llvm::raw_ostream &OS); + // Registry for adding new SerializationFormat implementations. using SerializationFormatRegistry = llvm::Registry<SerializationFormat>; diff --git a/clang/include/clang/Analysis/Scalable/TUSummary/ExtractorRegistry.h b/clang/include/clang/Analysis/Scalable/TUSummary/ExtractorRegistry.h index d9147871a5101..c02f956ebc73d 100644 --- a/clang/include/clang/Analysis/Scalable/TUSummary/ExtractorRegistry.h +++ b/clang/include/clang/Analysis/Scalable/TUSummary/ExtractorRegistry.h @@ -30,6 +30,7 @@ #include "clang/Support/Compiler.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/Registry.h" +#include "llvm/Support/raw_ostream.h" namespace clang::ssaf { @@ -43,6 +44,9 @@ bool isTUSummaryExtractorRegistered(llvm::StringRef SummaryName); std::unique_ptr<ASTConsumer> makeTUSummaryExtractor(llvm::StringRef SummaryName, TUSummaryBuilder &Builder); +/// Print the list of available TUSummaryExtractors. +void printAvailableTUSummaryExtractors(llvm::raw_ostream &OS); + // Registry for adding new TUSummaryExtractor implementations. using TUSummaryExtractorRegistry = llvm::Registry<TUSummaryExtractor, TUSummaryBuilder &>; diff --git a/clang/include/clang/Frontend/FrontendOptions.h b/clang/include/clang/Frontend/FrontendOptions.h index 0d8eb6a1b7379..f7f51bc37c98d 100644 --- a/clang/include/clang/Frontend/FrontendOptions.h +++ b/clang/include/clang/Frontend/FrontendOptions.h @@ -550,6 +550,14 @@ class FrontendOptions { /// format. std::string SSAFTUSummaryFile; + /// Show available SSAF summary extractors. + LLVM_PREFERRED_TYPE(bool) + unsigned SSAFShowExtractors : 1; + + /// Show available SSAF serialization formats. + LLVM_PREFERRED_TYPE(bool) + unsigned SSAFShowFormats : 1; + public: FrontendOptions() : DisableFree(false), RelocatablePCH(false), ShowHelp(false), @@ -567,7 +575,8 @@ class FrontendOptions { EmitPrettySymbolGraphs(false), GenReducedBMI(false), UseClangIRPipeline(false), ClangIRDisablePasses(false), ClangIRDisableCIRVerifier(false), ClangIREnableIdiomRecognizer(false), - TimeTraceGranularity(500), TimeTraceVerbose(false) {} + TimeTraceGranularity(500), TimeTraceVerbose(false), + SSAFShowExtractors(false), SSAFShowFormats(false) {} /// getInputKindForExtension - Return the appropriate input kind for a file /// extension. For example, "c" would return Language::C. diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td index 011ed4bf95675..a5ab6d88bbd86 100644 --- a/clang/include/clang/Options/Options.td +++ b/clang/include/clang/Options/Options.td @@ -961,6 +961,18 @@ def _ssaf_tu_summary_file : "The output file for the extracted summaries. " "The extension selects which file format to use.">, MarshallingInfoString<FrontendOpts<"SSAFTUSummaryFile">>; +def _ssaf_list_extractors : + Flag<["--"], "ssaf-list-extractors">, + Group<SSAF_Group>, + Visibility<[ClangOption, CC1Option]>, + HelpText<"Display the list of available SSAF summary extractors">, + MarshallingInfoFlag<FrontendOpts<"SSAFShowExtractors">>; +def _ssaf_list_formats : + Flag<["--"], "ssaf-list-formats">, + Group<SSAF_Group>, + Visibility<[ClangOption, CC1Option]>, + HelpText<"Display the list of available SSAF serialization formats">, + MarshallingInfoFlag<FrontendOpts<"SSAFShowFormats">>; def Xarch__ : JoinedAndSeparate<["-"], "Xarch_">, Flags<[NoXarchOption]>, diff --git a/clang/lib/Analysis/Scalable/Serialization/SerializationFormatRegistry.cpp b/clang/lib/Analysis/Scalable/Serialization/SerializationFormatRegistry.cpp index 7cfa4370aa9ed..6c0ece351856b 100644 --- a/clang/lib/Analysis/Scalable/Serialization/SerializationFormatRegistry.cpp +++ b/clang/lib/Analysis/Scalable/Serialization/SerializationFormatRegistry.cpp @@ -29,3 +29,9 @@ ssaf::makeFormat(llvm::StringRef FormatName) { assert(false && "Unknown SerializationFormat name"); return nullptr; } + +void ssaf::printAvailableFormats(llvm::raw_ostream &OS) { + OS << "OVERVIEW: Available SSAF serialization formats:\n\n"; + for (const auto &Entry : SerializationFormatRegistry::entries()) + OS << " " << Entry.getName() << " - " << Entry.getDesc() << "\n"; +} diff --git a/clang/lib/Analysis/Scalable/TUSummary/ExtractorRegistry.cpp b/clang/lib/Analysis/Scalable/TUSummary/ExtractorRegistry.cpp index 8e3871126a2b3..1849ef753106d 100644 --- a/clang/lib/Analysis/Scalable/TUSummary/ExtractorRegistry.cpp +++ b/clang/lib/Analysis/Scalable/TUSummary/ExtractorRegistry.cpp @@ -33,3 +33,9 @@ ssaf::makeTUSummaryExtractor(llvm::StringRef SummaryName, assert(false && "Unknown SummaryExtractor name"); return nullptr; } + +void ssaf::printAvailableTUSummaryExtractors(llvm::raw_ostream &OS) { + OS << "OVERVIEW: Available SSAF summary extractors:\n\n"; + for (const auto &Entry : TUSummaryExtractorRegistry::entries()) + OS << " " << Entry.getName() << " - " << Entry.getDesc() << "\n"; +} diff --git a/clang/lib/Driver/CMakeLists.txt b/clang/lib/Driver/CMakeLists.txt index f5440a01a5932..e945db961256f 100644 --- a/clang/lib/Driver/CMakeLists.txt +++ b/clang/lib/Driver/CMakeLists.txt @@ -99,6 +99,7 @@ add_clang_library(clangDriver target_parser_gen LINK_LIBS + clangAnalysisScalable clangBasic clangFrontend clangSerialization diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 420340aaab885..ff2a74ef49ab5 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -53,6 +53,9 @@ #include "ToolChains/WebAssembly.h" #include "ToolChains/XCore.h" #include "ToolChains/ZOS.h" +#include "clang/Analysis/Scalable/SSAFForceLinker.h" // IWYU pragma: keep +#include "clang/Analysis/Scalable/Serialization/SerializationFormatRegistry.h" +#include "clang/Analysis/Scalable/TUSummary/ExtractorRegistry.h" #include "clang/Basic/DiagnosticDriver.h" #include "clang/Basic/TargetID.h" #include "clang/Basic/Version.h" @@ -2555,6 +2558,22 @@ bool Driver::HandleImmediateArgs(Compilation &C) { return false; } + // Honor --ssaf-list-extractors, --ssaf-list-formats and their combinations. + bool ListExtractors = C.getArgs().hasArg(options::OPT__ssaf_list_extractors); + bool ListFormats = C.getArgs().hasArg(options::OPT__ssaf_list_formats); + if (ListExtractors || ListFormats) { + if (ListExtractors) + ssaf::printAvailableTUSummaryExtractors(llvm::outs()); + if (ListFormats) + ssaf::printAvailableFormats(llvm::outs()); + return false; + } + + if (C.getArgs().hasArg(options::OPT__ssaf_list_formats)) { + ssaf::printAvailableFormats(llvm::outs()); + return false; + } + if (C.getArgs().hasArg(options::OPT_v) || C.getArgs().hasArg(options::OPT__HASH_HASH_HASH) || C.getArgs().hasArg(options::OPT_print_supported_cpus) || diff --git a/clang/test/Analysis/SSAF/help.cpp b/clang/test/Analysis/SSAF/help.cpp index 3755b96e3ce4f..a2e72cd198af7 100644 --- a/clang/test/Analysis/SSAF/help.cpp +++ b/clang/test/Analysis/SSAF/help.cpp @@ -1,7 +1,21 @@ -// RUN: %clang --help 2>&1 | FileCheck %s -// RUN: %clang_cc1 --help 2>&1 | FileCheck %s +// DEFINE: %{filecheck} = FileCheck %s --match-full-lines --check-prefix -// CHECK: --ssaf-extract-summaries=<summary-names> -// CHECK-NEXT: Comma-separated list of summary names to extract -// CHECK-NEXT: --ssaf-tu-summary-file=<path>.<format> -// CHECK-NEXT: The output file for the extracted summaries. The extension selects which file format to use. +// RUN: %clang --help 2>&1 | %{filecheck}=HELP +// RUN: %clang_cc1 --help 2>&1 | %{filecheck}=HELP + +// HELP: --ssaf-extract-summaries=<summary-names> +// HELP-NEXT: Comma-separated list of summary names to extract +// HELP-NEXT: --ssaf-list-extractors Display the list of available SSAF summary extractors +// HELP-NEXT: --ssaf-list-formats Display the list of available SSAF serialization formats +// HELP-NEXT: --ssaf-tu-summary-file=<path>.<format> +// HELP-NEXT: The output file for the extracted summaries. The extension selects which file format to use. + +// FIXME: --ssaf-list-{extractors,formats} only work with the `clang` driver. +// RUN: %clang --ssaf-list-extractors 2>&1 | %{filecheck}=LIST-EXTRACTORS +// LIST-EXTRACTORS: OVERVIEW: Available SSAF summary extractors: + +// RUN: %clang --ssaf-list-formats 2>&1 | %{filecheck}=LIST-FORMATS +// LIST-FORMATS: OVERVIEW: Available SSAF serialization formats: +// LIST-FORMATS: json - JSON serialization format + +// RUN: %clang --ssaf-list-extractors --ssaf-list-formats 2>&1 | %{filecheck}=LIST-EXTRACTORS,LIST-FORMATS From e69943642e23b1d088e47011e82458e0b093c775 Mon Sep 17 00:00:00 2001 From: Balazs Benics <[email protected]> Date: Mon, 16 Mar 2026 17:47:51 +0000 Subject: [PATCH 2/2] Uplift include paths after merge --- clang/lib/Driver/Driver.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 208c1149342c3..c559855ac91f5 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -53,9 +53,6 @@ #include "ToolChains/WebAssembly.h" #include "ToolChains/XCore.h" #include "ToolChains/ZOS.h" -#include "clang/Analysis/Scalable/SSAFForceLinker.h" // IWYU pragma: keep -#include "clang/Analysis/Scalable/Serialization/SerializationFormatRegistry.h" -#include "clang/Analysis/Scalable/TUSummary/ExtractorRegistry.h" #include "clang/Basic/DiagnosticDriver.h" #include "clang/Basic/TargetID.h" #include "clang/Basic/Version.h" @@ -72,6 +69,9 @@ #include "clang/Driver/Types.h" #include "clang/Options/OptionUtils.h" #include "clang/Options/Options.h" +#include "clang/ScalableStaticAnalysisFramework/Core/Serialization/SerializationFormatRegistry.h" +#include "clang/ScalableStaticAnalysisFramework/Core/TUSummary/ExtractorRegistry.h" +#include "clang/ScalableStaticAnalysisFramework/SSAFForceLinker.h" // IWYU pragma: keep #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallSet.h" _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
