[clang] [SSAF][SourceTransform] Add '--ssaf-link-unit-id=' for specifying link unit IDs (PR #218823)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 25 19:02:54 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-ssaf
Author: Ziqing Luo (ziqingluo-90)
<details>
<summary>Changes</summary>
The source-transformation pass takes WPA results as input, where entities are named under link-unit and compilation-unit namespaces. To associate ASTNodes with entities, the source-transformation pass needs to know both link-unit and compilation-unit IDs. Such information is provided by the caller.
rdar://185818153
---
Full diff: https://github.com/llvm/llvm-project/pull/218823.diff
12 Files Affected:
- (modified) clang/docs/ScalableStaticAnalysis/user-docs/SourceEditGeneration.md (+8-3)
- (modified) clang/include/clang/Basic/DiagnosticFrontendKinds.td (+2-1)
- (modified) clang/include/clang/Frontend/SSAFOptions.h (+4)
- (modified) clang/include/clang/Options/Options.td (+9)
- (modified) clang/lib/Driver/ToolChains/Clang.cpp (+1)
- (modified) clang/lib/ScalableStaticAnalysis/Frontend/SourceTransformationFrontendAction.cpp (+6)
- (modified) clang/test/Analysis/Scalable/help.cpp (+2)
- (modified) clang/test/Analysis/Scalable/source-edit-generation/cli-errors.cpp (+8-6)
- (modified) clang/test/Analysis/Scalable/source-edit-generation/coexistence.cpp (+1)
- (modified) clang/test/Analysis/Scalable/source-edit-generation/downgradable-errors.cpp (+2-1)
- (modified) clang/test/Analysis/Scalable/source-edit-generation/happy-path.cpp (+1)
- (modified) clang/test/Analysis/Scalable/source-edit-generation/write-failure.cpp (+2)
``````````diff
diff --git a/clang/docs/ScalableStaticAnalysis/user-docs/SourceEditGeneration.md b/clang/docs/ScalableStaticAnalysis/user-docs/SourceEditGeneration.md
index ad7d93d02fcf9..9a3ed2f10fd4e 100644
--- a/clang/docs/ScalableStaticAnalysis/user-docs/SourceEditGeneration.md
+++ b/clang/docs/ScalableStaticAnalysis/user-docs/SourceEditGeneration.md
@@ -12,11 +12,12 @@ and emits two per-translation-unit artifacts:
## Driver options
-Four options control the pipeline; they are all both `--ssaf-…` driver
+Five options control the pipeline; they are all both `--ssaf-…` driver
options and `cc1` options. The compilation-unit identifier is shared
with the summary extraction step. A given compilation unit needs to
receive the same identifier for both summary extraction and source
-edit generation.
+edit generation. The link-unit identifier must match the namespace
+name the compilation unit's `WPASuite` result was linked into.
```{eval-rst}
.. list-table::
@@ -38,6 +39,9 @@ edit generation.
* - ``--ssaf-compilation-unit-id=<id>``
- Stable identifier for this translation unit (also required by
the summary extraction).
+ * - ``--ssaf-link-unit-id=<id>``
+ - Stable identifier of the link unit this translation unit was
+ linked into.
```
When `--ssaf-source-transformation=` is non-empty the framework wraps
@@ -54,7 +58,8 @@ $ clang -c foo.cpp \
--ssaf-global-scope-analysis-result=wpa.json \
--ssaf-src-edit-file=foo.yaml \
--ssaf-transformation-report-file=foo.sarif \
- --ssaf-compilation-unit-id=cu-foo
+ --ssaf-compilation-unit-id=cu-foo \
+ --ssaf-link-unit-id=lu-foo
$ clang-apply-replacements --remove-change-desc-files <dir-with-yaml>
```
diff --git a/clang/include/clang/Basic/DiagnosticFrontendKinds.td b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
index be321ca83da12..a10f10502a702 100644
--- a/clang/include/clang/Basic/DiagnosticFrontendKinds.td
+++ b/clang/include/clang/Basic/DiagnosticFrontendKinds.td
@@ -446,7 +446,8 @@ def warn_ssaf_source_transformation_unknown_name :
def warn_ssaf_source_transformation_requires :
Warning<"option '--ssaf-source-transformation=' requires "
"'%select{--ssaf-global-scope-analysis-result=|--ssaf-src-edit-file=|"
- "--ssaf-transformation-report-file=|--ssaf-compilation-unit-id=}0' "
+ "--ssaf-transformation-report-file=|--ssaf-compilation-unit-id=|"
+ "--ssaf-link-unit-id=}0' "
"to be set">,
InGroup<ScalableStaticAnalysis>, DefaultError;
diff --git a/clang/include/clang/Frontend/SSAFOptions.h b/clang/include/clang/Frontend/SSAFOptions.h
index 189bf3b383c46..81bf686442c97 100644
--- a/clang/include/clang/Frontend/SSAFOptions.h
+++ b/clang/include/clang/Frontend/SSAFOptions.h
@@ -42,6 +42,10 @@ class SSAFOptions {
/// Controlled by: --ssaf-global-scope-analysis-result
std::string GlobalScopeAnalysisResult;
+ /// Stable identifier used as the name of the `LinkUnit` `BuildNamespace` of
+ /// every produced link unit. Controlled by: --ssaf-link-unit-id
+ std::string LinkUnitId;
+
/// Path of the source-edit output file produced by the source
/// transformation.
/// Controlled by: --ssaf-src-edit-file
diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td
index eb5a009b5628c..c5758ec7b557c 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -1021,6 +1021,15 @@ def _ssaf_global_scope_analysis_result :
"consumed by the source transformation. The extension selects which file "
"format to use.">,
MarshallingInfoString<SSAFOpts<"GlobalScopeAnalysisResult">>;
+def _ssaf_link_unit_id :
+ Joined<["--"], "ssaf-link-unit-id=">,
+ MetaVarName<"<id>">,
+ Group<SSAF_Group>,
+ Visibility<[ClangOption, CC1Option]>,
+ HelpText<
+ "Stable identifier used as the LinkUnit namespace name of every "
+ "produced SSAF link unit.">,
+ MarshallingInfoString<SSAFOpts<"LinkUnitId">>;
def _ssaf_src_edit_file :
Joined<["--"], "ssaf-src-edit-file=">,
MetaVarName<"<path>">,
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index b081265412752..fb94d114e0458 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -8137,6 +8137,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Args.AddLastArg(CmdArgs, options::OPT__ssaf_no_extract_from_system_headers);
Args.AddLastArg(CmdArgs, options::OPT__ssaf_source_transformation);
Args.AddLastArg(CmdArgs, options::OPT__ssaf_global_scope_analysis_result);
+ Args.AddLastArg(CmdArgs, options::OPT__ssaf_link_unit_id);
Args.AddLastArg(CmdArgs, options::OPT__ssaf_src_edit_file);
Args.AddLastArg(CmdArgs, options::OPT__ssaf_transformation_report_file);
diff --git a/clang/lib/ScalableStaticAnalysis/Frontend/SourceTransformationFrontendAction.cpp b/clang/lib/ScalableStaticAnalysis/Frontend/SourceTransformationFrontendAction.cpp
index 6ae7518e0ed56..4983d5e241e0f 100644
--- a/clang/lib/ScalableStaticAnalysis/Frontend/SourceTransformationFrontendAction.cpp
+++ b/clang/lib/ScalableStaticAnalysis/Frontend/SourceTransformationFrontendAction.cpp
@@ -98,6 +98,7 @@ enum SourceTransformationCompanion {
STCompanion_EditFile, // --ssaf-src-edit-file=
STCompanion_ReportFile, // --ssaf-transformation-report-file=
STCompanion_CompilationUnitId, // --ssaf-compilation-unit-id=
+ STCompanion_LinkUnitId, // --ssaf-link-unit-id=
};
/// Options that depend on `--ssaf-source-transformation=` being set. Values
@@ -136,6 +137,11 @@ static bool reportOrphanOptionMisuse(DiagnosticsEngine &Diags,
<< STCompanion_CompilationUnitId;
Reported = true;
}
+ if (Opts.LinkUnitId.empty()) {
+ Diags.Report(diag::warn_ssaf_source_transformation_requires)
+ << STCompanion_LinkUnitId;
+ Reported = true;
+ }
} else {
if (!Opts.SrcEditFile.empty()) {
Diags.Report(diag::warn_ssaf_option_ignored_without_source_transformation)
diff --git a/clang/test/Analysis/Scalable/help.cpp b/clang/test/Analysis/Scalable/help.cpp
index 3aee63d7ceaf5..c4220ff527bc5 100644
--- a/clang/test/Analysis/Scalable/help.cpp
+++ b/clang/test/Analysis/Scalable/help.cpp
@@ -11,6 +11,8 @@
// HELP-NEXT: Path to the WPASuite file containing the whole-program analysis result consumed by the source transformation. The extension selects which file format to use.
// HELP-NEXT: --ssaf-include-local-entities
// HELP-NEXT: Include block-scope (function-local) declarations in extracted SSAF summaries. By default they are omitted.
+// HELP-NEXT: --ssaf-link-unit-id=<id>
+// HELP-NEXT: Stable identifier used as the LinkUnit namespace name of every produced SSAF link unit.
// 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-no-extract-from-system-headers
diff --git a/clang/test/Analysis/Scalable/source-edit-generation/cli-errors.cpp b/clang/test/Analysis/Scalable/source-edit-generation/cli-errors.cpp
index bc1ea22039525..3212ae10cc8de 100644
--- a/clang/test/Analysis/Scalable/source-edit-generation/cli-errors.cpp
+++ b/clang/test/Analysis/Scalable/source-edit-generation/cli-errors.cpp
@@ -1,16 +1,17 @@
// CLI errors for the source-edit-generation pipeline. Every misuse of the
-// four `--ssaf-{source-transformation,global-scope-analysis-result,
-// src-edit-file,transformation-report-file}=` options emits a default-error
-// diagnostic under `-Wscalable-static-analysis-framework`. The runner
-// produces no edit/report files and the rest of the compile pipeline is
-// untouched.
+// six `--ssaf-{source-transformation,global-scope-analysis-result,
+// src-edit-file,transformation-report-file,compilation-unit-id,
+// link-unit-id}=` options emits a default-error diagnostic under
+// `-Wscalable-static-analysis-framework`. The runner produces no edit/report
+// files and the rest of the compile pipeline is untouched.
// DEFINE: %{filecheck} = FileCheck %s --match-full-lines --check-prefix
// DEFINE: %{base} = --ssaf-source-transformation=does-not-exist \
// DEFINE: --ssaf-global-scope-analysis-result=%S/Inputs/empty-suite.json \
// DEFINE: --ssaf-src-edit-file=%t/edits.yaml \
// DEFINE: --ssaf-transformation-report-file=%t/report.sarif \
-// DEFINE: --ssaf-compilation-unit-id=cu
+// DEFINE: --ssaf-compilation-unit-id=cu \
+// DEFINE: --ssaf-link-unit-id=lu
// =============================================================================
// 1. Unknown transformation name.
@@ -33,6 +34,7 @@
// ORPHAN-COMPANIONS-DAG: error: option '--ssaf-source-transformation=' requires '--ssaf-src-edit-file=' to be set [-Wscalable-static-analysis-framework]
// ORPHAN-COMPANIONS-DAG: error: option '--ssaf-source-transformation=' requires '--ssaf-transformation-report-file=' to be set [-Wscalable-static-analysis-framework]
// ORPHAN-COMPANIONS-DAG: error: option '--ssaf-source-transformation=' requires '--ssaf-compilation-unit-id=' to be set [-Wscalable-static-analysis-framework]
+// ORPHAN-COMPANIONS-DAG: error: option '--ssaf-source-transformation=' requires '--ssaf-link-unit-id=' to be set [-Wscalable-static-analysis-framework]
// =============================================================================
// 3. Reverse orphans: edit/report file set without transformation option.
diff --git a/clang/test/Analysis/Scalable/source-edit-generation/coexistence.cpp b/clang/test/Analysis/Scalable/source-edit-generation/coexistence.cpp
index 410022caaa3a9..b392fe0d2e808 100644
--- a/clang/test/Analysis/Scalable/source-edit-generation/coexistence.cpp
+++ b/clang/test/Analysis/Scalable/source-edit-generation/coexistence.cpp
@@ -17,6 +17,7 @@
// RUN: --ssaf-src-edit-file=%t/edits.yaml \
// RUN: --ssaf-transformation-report-file=%t/report.sarif \
// RUN: --ssaf-compilation-unit-id=cu \
+// RUN: --ssaf-link-unit-id=lu \
// RUN: -emit-obj -o %t/test.o %s
// All four artifacts must be present.
diff --git a/clang/test/Analysis/Scalable/source-edit-generation/downgradable-errors.cpp b/clang/test/Analysis/Scalable/source-edit-generation/downgradable-errors.cpp
index b2c79bc91cd51..008ef47f828dc 100644
--- a/clang/test/Analysis/Scalable/source-edit-generation/downgradable-errors.cpp
+++ b/clang/test/Analysis/Scalable/source-edit-generation/downgradable-errors.cpp
@@ -9,7 +9,8 @@
// DEFINE: --ssaf-global-scope-analysis-result=%S/Inputs/empty-suite.json \
// DEFINE: --ssaf-src-edit-file=%t/edits.yaml \
// DEFINE: --ssaf-transformation-report-file=%t/report.sarif \
-// DEFINE: --ssaf-compilation-unit-id=cu
+// DEFINE: --ssaf-compilation-unit-id=cu \
+// DEFINE: --ssaf-link-unit-id=lu
// =============================================================================
// 1. -Wno-error=scalable-static-analysis-framework downgrades to a warning.
diff --git a/clang/test/Analysis/Scalable/source-edit-generation/happy-path.cpp b/clang/test/Analysis/Scalable/source-edit-generation/happy-path.cpp
index a0e6ab0de7a88..ce79ae5f004fb 100644
--- a/clang/test/Analysis/Scalable/source-edit-generation/happy-path.cpp
+++ b/clang/test/Analysis/Scalable/source-edit-generation/happy-path.cpp
@@ -17,6 +17,7 @@
// RUN: --ssaf-src-edit-file=%t/edits.yaml \
// RUN: --ssaf-transformation-report-file=%t/report.sarif \
// RUN: --ssaf-compilation-unit-id=cu \
+// RUN: --ssaf-link-unit-id=lu \
// RUN: -emit-obj -o %t/test.o %s
// RUN: FileCheck --check-prefix=EDITS --input-file=%t/edits.yaml %s
diff --git a/clang/test/Analysis/Scalable/source-edit-generation/write-failure.cpp b/clang/test/Analysis/Scalable/source-edit-generation/write-failure.cpp
index 4c077702b1014..3f372d191ffd6 100644
--- a/clang/test/Analysis/Scalable/source-edit-generation/write-failure.cpp
+++ b/clang/test/Analysis/Scalable/source-edit-generation/write-failure.cpp
@@ -20,6 +20,7 @@
// RUN: --ssaf-src-edit-file=%t/missing-dir/edits.yaml \
// RUN: --ssaf-transformation-report-file=%t/report.sarif \
// RUN: --ssaf-compilation-unit-id=cu \
+// RUN: --ssaf-link-unit-id=lu \
// RUN: -emit-obj -o %t/test.o %s 2>&1 | FileCheck --check-prefix=EDIT-FAIL %s
// EDIT-FAIL: warning: failed to write source edits to '{{.*}}/missing-dir/edits.yaml'{{.*}}[-Wscalable-static-analysis-framework]
// RUN: test -e %t/test.o
@@ -36,6 +37,7 @@
// RUN: --ssaf-src-edit-file=%t/edits.yaml \
// RUN: --ssaf-transformation-report-file=%t/missing-dir/report.sarif \
// RUN: --ssaf-compilation-unit-id=cu \
+// RUN: --ssaf-link-unit-id=lu \
// RUN: -emit-obj -o %t/test.o %s 2>&1 | FileCheck --check-prefix=REPORT-FAIL %s
// REPORT-FAIL: warning: failed to write transformation report to '{{.*}}/missing-dir/report.sarif'{{.*}}[-Wscalable-static-analysis-framework]
// RUN: test -e %t/test.o
``````````
</details>
https://github.com/llvm/llvm-project/pull/218823
More information about the cfe-commits
mailing list