[clang] Reapply "[clang][ssaf][NFC] Rework how the Force linker anchors are defined and used" (PR #194693)
Balázs Benics via cfe-commits
cfe-commits at lists.llvm.org
Tue Apr 28 10:50:37 PDT 2026
https://github.com/steakhal created https://github.com/llvm/llvm-project/pull/194693
This reverts commit 582958c4337f539e650096c0257a322315298e1a.
Drop "const" from these anchor variables - like they are in clang-tidy
Turns out, MSVC likely doesn't conform with the C++ standard and makes
`const volatile` global variables have *internal* linkage - while they
should have *external* linkage.
https://eel.is/c++draft/basic.link#3.2
```
(3) The name of an entity that belongs to a namespace scope has internal linkage if it is the name of
(3.1) a variable, variable template, function, or function template that is explicitly declared static; or
(3.2) a non-template variable of non-volatile const-qualified type, unless
(3.2.1) it is declared in the purview of a module interface unit (outside the private-module-fragment, if any) or module partition, or
(3.2.2) it is explicitly declared extern, or
(3.2.3) it is inline, or
(3.2.4) it was previously declared and the prior declaration did not have internal linkage; or
```
Consequently, `const volatile` globals should NOT have *internal*
linkage, because `volatile` variables are exempt by (3.2).
>From 4d83c73cfe818633ab871e84dd226cf576328360 Mon Sep 17 00:00:00 2001
From: Balazs Benics <benicsbalazs at gmail.com>
Date: Tue, 28 Apr 2026 17:48:07 +0100
Subject: [PATCH 1/2] Reapply "[clang][ssaf][NFC] Rework how the Force linker
anchors are defined and used" (#193451)
This reverts commit 582958c4337f539e650096c0257a322315298e1a.
---
.../developer-docs/ForceLinkerHeaders.rst | 34 ++++++++-----
.../developer-docs/HowToExtend.rst | 27 ++++++----
.../BuiltinAnchorSources.def | 26 ++++++++++
.../SerializationFormatRegistry.h | 10 ++--
.../Core/TUSummary/ExtractorRegistry.h | 10 ++--
.../WholeProgramAnalysis/AnalysisRegistry.h | 14 ++---
.../SSAFBuiltinForceLinker.h | 45 ++++++----------
.../Analyses/CallGraph/CallGraphExtractor.cpp | 6 +--
.../CallGraph/CallGraphJSONFormat.cpp | 6 +--
.../UnsafeBufferUsage/UnsafeBufferUsage.cpp | 8 +--
.../UnsafeBufferUsageExtractor.cpp | 5 +-
.../JSONFormat/JSONFormatImpl.cpp | 15 ++++--
.../WholeProgramAnalysis/AnalysisRegistry.cpp | 11 ++--
.../TUSummaryExtractorFrontendActionTest.cpp | 4 --
.../Registries/FancyAnalysisData.cpp | 2 -
.../Registries/MockSerializationFormat.cpp | 2 -
.../Registries/MockSummaryExtractor1.cpp | 2 -
.../Registries/MockSummaryExtractor2.cpp | 2 -
.../SSAFBuiltinTestForceLinker.h | 51 -------------------
.../SSAFTestForceLinker.h | 23 ---------
.../TestFixture.cpp | 1 -
.../AnalysisDriverTest.cpp | 4 --
22 files changed, 123 insertions(+), 185 deletions(-)
create mode 100644 clang/include/clang/ScalableStaticAnalysisFramework/BuiltinAnchorSources.def
delete mode 100644 clang/unittests/ScalableStaticAnalysisFramework/SSAFBuiltinTestForceLinker.h
delete mode 100644 clang/unittests/ScalableStaticAnalysisFramework/SSAFTestForceLinker.h
diff --git a/clang/docs/ScalableStaticAnalysisFramework/developer-docs/ForceLinkerHeaders.rst b/clang/docs/ScalableStaticAnalysisFramework/developer-docs/ForceLinkerHeaders.rst
index c04b2b786308f..d4504aa5a793a 100644
--- a/clang/docs/ScalableStaticAnalysisFramework/developer-docs/ForceLinkerHeaders.rst
+++ b/clang/docs/ScalableStaticAnalysisFramework/developer-docs/ForceLinkerHeaders.rst
@@ -33,26 +33,29 @@ constructors unconditionally.
The solution: anchor symbols
****************************
-Each registration translation unit defines a ``volatile int`` **anchor symbol**:
+Each registration translation unit defines a ``const volatile int`` **anchor symbol**:
.. code-block:: c++
- // In MyExtractor.cpp — next to the registry Add<> object
+ // In MyExtractor.cpp - next to the registry Add<> object in the ``clang::ssaf`` namespace
// NOLINTNEXTLINE(misc-use-internal-linkage)
- volatile int SSAFMyExtractorAnchorSource = 0;
+ const volatile int MyExtractorAnchorSource = 0;
-A **force-linker header** declares the symbol as ``extern`` and reads it into a
-``[[maybe_unused]] static int`` destination:
+For **in-tree** anchors, add a single ``ANCHOR(...)`` entry to
+``BuiltinAnchorSources.def`` (in alphabetical order):
.. code-block:: c++
- // In SSAFBuiltinForceLinker.h
- extern volatile int SSAFMyExtractorAnchorSource;
- [[maybe_unused]] static int SSAFMyExtractorAnchorDestination =
- SSAFMyExtractorAnchorSource;
+ // In clang/include/clang/ScalableStaticAnalysisFramework/BuiltinAnchorSources.def
+ ANCHOR(JSONFormatAnchorSource)
+ ANCHOR(MyExtractorAnchorSource) // <-- Add here, in alphabetical order
+
+``SSAFBuiltinForceLinker.h`` includes this ``.def`` file automatically to
+generate the ``extern`` declarations and the ``AnchorSources`` array — there is
+no need to edit that header directly.
Any translation unit that ``#include``\s this header now has a reference to
-``SSAFMyExtractorAnchorSource``, which forces the linker to pull in
+``MyExtractorAnchorSource``, which forces the linker to pull in
``MyExtractor.o`` — and with it, the static ``Add<>`` registration object.
The ``volatile`` qualifier is essential: without it the compiler could
@@ -85,11 +88,14 @@ point of a binary that uses ``clangScalableStaticAnalysisFrameworkCore``:
Naming convention
=================
-Anchor symbols follow the pattern ``SSAF<Component>AnchorSource`` and
-``SSAF<Component>AnchorDestination``. For example:
+Anchor symbols follow the pattern ``<Component>AnchorSource`` in the ``clang::ssaf`` namespace.
+For example:
+
+- ``JSONFormatAnchorSource``
+- ``MyExtractorAnchorSource``
-- ``SSAFJSONFormatAnchorSource`` / ``SSAFJSONFormatAnchorDestination``
-- ``SSAFMyExtractorAnchorSource`` / ``SSAFMyExtractorAnchorDestination``
+All anchor sources are aggregated into a single ``BuiltinAnchorDestination``
+lambda in the force-linker header (see ``SSAFBuiltinForceLinker.h``).
Considered alternatives
***********************
diff --git a/clang/docs/ScalableStaticAnalysisFramework/developer-docs/HowToExtend.rst b/clang/docs/ScalableStaticAnalysisFramework/developer-docs/HowToExtend.rst
index 7d92d7e6f2de7..ac377813986ec 100644
--- a/clang/docs/ScalableStaticAnalysisFramework/developer-docs/HowToExtend.rst
+++ b/clang/docs/ScalableStaticAnalysisFramework/developer-docs/HowToExtend.rst
@@ -53,8 +53,10 @@ Step 2: Register the extractor
using namespace clang::ssaf;
+ namespace clang::ssaf {
// NOLINTNEXTLINE(misc-use-internal-linkage)
- volatile int SSAFMyExtractorAnchorSource = 0;
+ const volatile int MyExtractorAnchorSource = 0;
+ } // namespace clang::ssaf
static TUSummaryExtractorRegistry::Add<MyExtractor>
RegisterExtractor("MyExtractor", "My awesome summary extractor");
@@ -65,16 +67,17 @@ Step 3: Add the force-linker anchor
===================================
See :doc:`ForceLinkerHeaders` for a full explanation of why this is needed.
-Add the following to the appropriate force-linker header:
+
+For **in-tree** additions, add one line to
+``clang/include/clang/ScalableStaticAnalysisFramework/BuiltinAnchorSources.def``
+(in alphabetical order):
.. code-block:: c++
- extern volatile int SSAFMyExtractorAnchorSource;
- [[maybe_unused]] static int SSAFMyExtractorAnchorDestination =
- SSAFMyExtractorAnchorSource;
+ ANCHOR(MyExtractorAnchorSource)
-For **in-tree** additions, add this to
-``clang/include/clang/ScalableStaticAnalysisFramework/SSAFBuiltinForceLinker.h``.
+``SSAFBuiltinForceLinker.h`` includes this ``.def`` file automatically — no
+need to edit it directly.
For **downstream** additions, see `Out-of-tree (downstream) extensions`_ below.
@@ -125,8 +128,10 @@ Step 2: Register the format
using namespace clang::ssaf;
+ namespace clang::ssaf {
// NOLINTNEXTLINE(misc-use-internal-linkage)
- volatile int SSAFMyFormatAnchorSource = 0;
+ const volatile int MyFormatAnchorSource = 0;
+ } // namespace clang::ssaf
static SerializationFormatRegistry::Add<MyFormat>
RegisterFormat("myformat", "My awesome serialization format");
@@ -161,7 +166,9 @@ For each analysis that should be serializable in your format, register a ``Forma
Step 4: Add the force-linker anchor
===================================
-Same pattern as for extractors — see `Adding a summary extractor`_ Step 3, and :doc:`ForceLinkerHeaders`.
+Same pattern as for extractors — add the anchor to ``BuiltinAnchorSources.def``
+(in alphabetical order). See `Adding a summary extractor`_ Step 3,
+and :doc:`ForceLinkerHeaders`.
Static extensibility
@@ -172,7 +179,7 @@ In-tree extensions
For extensions that are part of the upstream LLVM/Clang tree:
-#. Add the anchor to ``clang/include/clang/ScalableStaticAnalysisFramework/SSAFBuiltinForceLinker.h``.
+#. Add the anchor to ``clang/include/clang/ScalableStaticAnalysisFramework/BuiltinAnchorSources.def`` (in alphabetical order).
#. Add the source files to the ``clangScalableStaticAnalysisFrameworkCore`` CMake library target.
#. That's it — the ``SSAFForceLinker.h`` umbrella includes ``SSAFBuiltinForceLinker.h``
transitively, so any binary that includes the umbrella will pull in the registration.
diff --git a/clang/include/clang/ScalableStaticAnalysisFramework/BuiltinAnchorSources.def b/clang/include/clang/ScalableStaticAnalysisFramework/BuiltinAnchorSources.def
new file mode 100644
index 0000000000000..63235f0630afc
--- /dev/null
+++ b/clang/include/clang/ScalableStaticAnalysisFramework/BuiltinAnchorSources.def
@@ -0,0 +1,26 @@
+//===- BuiltinAnchorSources.def ---------------------------------*- C++ -*-===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This file lists all the SSAF Anchor source names.
+/// This file should be exclusively used by SSAFBuiltinForceLinker.h
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef ANCHOR
+#define ANCHOR(NAME)
+#endif
+
+ANCHOR(AnalysisRegistryAnchorSource)
+ANCHOR(CallGraphExtractorAnchorSource)
+ANCHOR(CallGraphJSONFormatAnchorSource)
+ANCHOR(JSONFormatAnchorSource)
+ANCHOR(UnsafeBufferUsageExtractorAnchorSource)
+ANCHOR(UnsafeBufferUsageJSONFormatAnchorSource)
+
+#undef ANCHOR
diff --git a/clang/include/clang/ScalableStaticAnalysisFramework/Core/Serialization/SerializationFormatRegistry.h b/clang/include/clang/ScalableStaticAnalysisFramework/Core/Serialization/SerializationFormatRegistry.h
index a1955e64d5137..bc146a5340339 100644
--- a/clang/include/clang/ScalableStaticAnalysisFramework/Core/Serialization/SerializationFormatRegistry.h
+++ b/clang/include/clang/ScalableStaticAnalysisFramework/Core/Serialization/SerializationFormatRegistry.h
@@ -24,8 +24,10 @@
//
// Insert this code to the cpp file:
//
+// namespace clang::ssaf {
// // NOLINTNEXTLINE(misc-use-internal-linkage)
-// volatile int SSAFMyFormatAnchorSource = 0;
+// const volatile int MyFormatAnchorSource = 0;
+// } // namespace clang::ssaf
// static SerializationFormatRegistry::Add<MyFormat>
// RegisterFormat("MyFormat", "My awesome serialization format");
// LLVM_INSTANTIATE_REGISTRY(llvm::Registry<MyFormat::FormatInfo>)
@@ -50,15 +52,11 @@
// "The MyFormat format info implementation for MyAnalysis"
// );
//
-// Finally, insert a use of the new anchor symbol into the force-linker header:
+// Finally, extend the `AnchorSources` list in the force-linker header:
// clang/include/clang/ScalableStaticAnalysisFramework/SSAFBuiltinForceLinker.h:
//
// This anchor is used to force the linker to link the MyFormat registration.
//
-// extern volatile int SSAFMyFormatAnchorSource;
-// [[maybe_unused]] static int SSAFMyFormatAnchorDestination =
-// SSAFMyFormatAnchorSource;
-//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_SCALABLESTATICANALYSISFRAMEWORK_CORE_SERIALIZATION_SERIALIZATIONFORMATREGISTRY_H
diff --git a/clang/include/clang/ScalableStaticAnalysisFramework/Core/TUSummary/ExtractorRegistry.h b/clang/include/clang/ScalableStaticAnalysisFramework/Core/TUSummary/ExtractorRegistry.h
index da57838c64b2f..6af6f949a6af8 100644
--- a/clang/include/clang/ScalableStaticAnalysisFramework/Core/TUSummary/ExtractorRegistry.h
+++ b/clang/include/clang/ScalableStaticAnalysisFramework/Core/TUSummary/ExtractorRegistry.h
@@ -9,18 +9,16 @@
// Registry for TUSummaryExtractors, and some helper functions.
// To register some custom extractor, insert this code:
//
+// namespace clang::ssaf {
// // NOLINTNEXTLINE(misc-use-internal-linkage)
-// volatile int SSAFMyExtractorAnchorSource = 0;
+// const volatile int MyExtractorAnchorSource = 0;
+// } // namespace clang::ssaf
// static TUSummaryExtractorRegistry::Add<MyExtractor>
// X("MyExtractor", "My awesome extractor");
//
-// Finally, insert a use of the new anchor symbol into the force-linker header:
+// Finally, extend the `AnchorSources` list in the force-linker header:
// clang/include/clang/ScalableStaticAnalysisFramework/SSAFBuiltinForceLinker.h:
//
-// extern volatile int SSAFMyExtractorAnchorSource;
-// [[maybe_unused]] static int SSAFMyExtractorAnchorDestination =
-// SSAFMyExtractorAnchorSource;
-//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_SCALABLESTATICANALYSISFRAMEWORK_CORE_TUSUMMARY_EXTRACTORREGISTRY_H
diff --git a/clang/include/clang/ScalableStaticAnalysisFramework/Core/WholeProgramAnalysis/AnalysisRegistry.h b/clang/include/clang/ScalableStaticAnalysisFramework/Core/WholeProgramAnalysis/AnalysisRegistry.h
index 44eabce6c809c..f747775c2c498 100644
--- a/clang/include/clang/ScalableStaticAnalysisFramework/Core/WholeProgramAnalysis/AnalysisRegistry.h
+++ b/clang/include/clang/ScalableStaticAnalysisFramework/Core/WholeProgramAnalysis/AnalysisRegistry.h
@@ -9,19 +9,19 @@
// Unified registry for both SummaryAnalysis and DerivedAnalysis subclasses.
//
// To register an analysis, add a static Add<AnalysisT> and an anchor source
-// in its translation unit, then add the matching anchor destination to the
-// relevant force-linker header:
+// in its translation unit, then add the anchor source to the `AnchorSources`
+// list in the relevant force-linker header:
//
// // MyAnalysis.cpp
// static AnalysisRegistry::Add<MyAnalysis>
// Registered("One-line description of MyAnalysis");
//
-// volatile int SSAFMyAnalysisAnchorSource = 0;
+// namespace clang::ssaf {
+// // NOLINTNEXTLINE(misc-use-internal-linkage)
+// const volatile int MyAnalysisAnchorSource = 0;
+// } // namespace clang::ssaf
//
-// // SSAFBuiltinForceLinker.h (or the relevant force-linker header)
-// extern volatile int SSAFMyAnalysisAnchorSource;
-// [[maybe_unused]] static int SSAFMyAnalysisAnchorDestination =
-// SSAFMyAnalysisAnchorSource;
+// // Extend SSAFBuiltinForceLinker.h (or the relevant force-linker header)
//
// The registry entry name is derived automatically from
// MyAnalysis::analysisName(), so name-mismatch bugs are impossible.
diff --git a/clang/include/clang/ScalableStaticAnalysisFramework/SSAFBuiltinForceLinker.h b/clang/include/clang/ScalableStaticAnalysisFramework/SSAFBuiltinForceLinker.h
index 5616976e10f77..0bfc4356969a5 100644
--- a/clang/include/clang/ScalableStaticAnalysisFramework/SSAFBuiltinForceLinker.h
+++ b/clang/include/clang/ScalableStaticAnalysisFramework/SSAFBuiltinForceLinker.h
@@ -20,39 +20,24 @@
#ifndef LLVM_CLANG_SCALABLESTATICANALYSISFRAMEWORK_SSAFBUILTINFORCELINKER_H
#define LLVM_CLANG_SCALABLESTATICANALYSISFRAMEWORK_SSAFBUILTINFORCELINKER_H
-// TODO: Move these to the `clang::ssaf` namespace.
+namespace clang::ssaf {
-// This anchor is used to force the linker to link the JSONFormat registration.
-extern volatile int SSAFJSONFormatAnchorSource;
-[[maybe_unused]] static int SSAFJSONFormatAnchorDestination =
- SSAFJSONFormatAnchorSource;
+#define ANCHOR(NAME) extern const volatile int NAME;
+#include "BuiltinAnchorSources.def"
-// This anchor is used to force the linker to link the AnalysisRegistry.
-extern volatile int SSAFAnalysisRegistryAnchorSource;
-[[maybe_unused]] static int SSAFAnalysisRegistryAnchorDestination =
- SSAFAnalysisRegistryAnchorSource;
+// Force the linker to link in the built-in SSAF registrations.
+[[maybe_unused]] static const int BuiltinAnchorDestination = [] {
+ int AnchorSources[]{
+#define ANCHOR(NAME) NAME,
+#include "BuiltinAnchorSources.def"
+ };
-// This anchor is used to force the linker to link the UnsafeBufferUsage
-// JSON format.
-extern volatile int UnsafeBufferUsageSSAFJSONFormatAnchorSource;
-[[maybe_unused]] static int UnsafeBufferUsageSSAFJSONFormatAnchorDestination =
- UnsafeBufferUsageSSAFJSONFormatAnchorSource;
+ int SomeUse = 0;
+ for (int V : AnchorSources)
+ SomeUse |= V;
+ return SomeUse;
+}();
-// This anchor is used to force the linker to link the
-// UnsafeBufferUsageTUSummaryExtractor.
-extern volatile int UnsafeBufferUsageTUSummaryExtractorAnchorSource;
-[[maybe_unused]] static int
- UnsafeBufferUsageTUSummaryExtractorAnchorDestination =
- UnsafeBufferUsageTUSummaryExtractorAnchorSource;
-
-// This anchor is used to force the linker to link the CallGraphExtractor.
-extern volatile int CallGraphExtractorAnchorSource;
-[[maybe_unused]] static int CallGraphExtractorAnchorDestination =
- CallGraphExtractorAnchorSource;
-
-// This anchor is used to force the linker to link the CallGraph JSON format.
-extern volatile int CallGraphJSONFormatAnchorSource;
-[[maybe_unused]] static int CallGraphJSONFormatAnchorDestination =
- CallGraphJSONFormatAnchorSource;
+} // namespace clang::ssaf
#endif // LLVM_CLANG_SCALABLESTATICANALYSISFRAMEWORK_SSAFBUILTINFORCELINKER_H
diff --git a/clang/lib/ScalableStaticAnalysisFramework/Analyses/CallGraph/CallGraphExtractor.cpp b/clang/lib/ScalableStaticAnalysisFramework/Analyses/CallGraph/CallGraphExtractor.cpp
index 1dbed7e0b0d8a..3651953a413e2 100644
--- a/clang/lib/ScalableStaticAnalysisFramework/Analyses/CallGraph/CallGraphExtractor.cpp
+++ b/clang/lib/ScalableStaticAnalysisFramework/Analyses/CallGraph/CallGraphExtractor.cpp
@@ -101,7 +101,7 @@ static TUSummaryExtractorRegistry::Add<CallGraphExtractor>
RegisterExtractor(CallGraphSummary::Name,
"Extracts static call-graph information");
-// This anchor is used to force the linker to link in the generated object file
-// and thus register the CallGraphExtractor.
+namespace clang::ssaf {
// NOLINTNEXTLINE(misc-use-internal-linkage)
-volatile int CallGraphExtractorAnchorSource = 0;
+const volatile int CallGraphExtractorAnchorSource = 0;
+} // namespace clang::ssaf
diff --git a/clang/lib/ScalableStaticAnalysisFramework/Analyses/CallGraph/CallGraphJSONFormat.cpp b/clang/lib/ScalableStaticAnalysisFramework/Analyses/CallGraph/CallGraphJSONFormat.cpp
index 860e26417eb55..209b05bdb0efb 100644
--- a/clang/lib/ScalableStaticAnalysisFramework/Analyses/CallGraph/CallGraphJSONFormat.cpp
+++ b/clang/lib/ScalableStaticAnalysisFramework/Analyses/CallGraph/CallGraphJSONFormat.cpp
@@ -168,7 +168,7 @@ static llvm::Registry<JSONFormat::FormatInfo>::Add<CallGraphJSONFormatInfo>
RegisterFormatInfo(CallGraphSummary::Name,
"JSON Format info for CallGraph summary");
-// This anchor is used to force the linker to link in the generated object file
-// and thus register the JSON format for CallGraphSummary.
+namespace clang::ssaf {
// NOLINTNEXTLINE(misc-use-internal-linkage)
-volatile int CallGraphJSONFormatAnchorSource = 0;
+const volatile int CallGraphJSONFormatAnchorSource = 0;
+} // namespace clang::ssaf
diff --git a/clang/lib/ScalableStaticAnalysisFramework/Analyses/UnsafeBufferUsage/UnsafeBufferUsage.cpp b/clang/lib/ScalableStaticAnalysisFramework/Analyses/UnsafeBufferUsage/UnsafeBufferUsage.cpp
index ea5d2297b9836..d7d4dae453e56 100644
--- a/clang/lib/ScalableStaticAnalysisFramework/Analyses/UnsafeBufferUsage/UnsafeBufferUsage.cpp
+++ b/clang/lib/ScalableStaticAnalysisFramework/Analyses/UnsafeBufferUsage/UnsafeBufferUsage.cpp
@@ -84,9 +84,6 @@ static llvm::Registry<JSONFormat::FormatInfo>::Add<
UnsafeBufferUsageEntitySummary::Name,
"JSON Format info for UnsafeBufferUsageEntitySummary");
-// NOLINTNEXTLINE(misc-use-internal-linkage)
-volatile int UnsafeBufferUsageSSAFJSONFormatAnchorSource = 0;
-
// For unit test:
llvm::Expected<std::unique_ptr<EntitySummary>>
ssaf::serializeDeserializeRoundTrip(
@@ -108,3 +105,8 @@ ssaf::serializeDeserializeRoundTrip(
return deserializeImpl(serialize(S, IdToJson), IdFromJson);
}
+
+namespace clang::ssaf {
+// NOLINTNEXTLINE(misc-use-internal-linkage)
+const volatile int UnsafeBufferUsageJSONFormatAnchorSource = 0;
+} // namespace clang::ssaf
diff --git a/clang/lib/ScalableStaticAnalysisFramework/Analyses/UnsafeBufferUsage/UnsafeBufferUsageExtractor.cpp b/clang/lib/ScalableStaticAnalysisFramework/Analyses/UnsafeBufferUsage/UnsafeBufferUsageExtractor.cpp
index 550416c353fb7..ec9295d968561 100644
--- a/clang/lib/ScalableStaticAnalysisFramework/Analyses/UnsafeBufferUsage/UnsafeBufferUsageExtractor.cpp
+++ b/clang/lib/ScalableStaticAnalysisFramework/Analyses/UnsafeBufferUsage/UnsafeBufferUsageExtractor.cpp
@@ -98,9 +98,10 @@ void clang::ssaf::UnsafeBufferUsageTUSummaryExtractor::HandleTranslationUnit(
assert(InsertionSucceeded && "duplicated contributor extraction");
}
}
-
+namespace clang::ssaf {
// NOLINTNEXTLINE(misc-use-internal-linkage)
-volatile int UnsafeBufferUsageTUSummaryExtractorAnchorSource = 0;
+const volatile int UnsafeBufferUsageExtractorAnchorSource = 0;
+} // namespace clang::ssaf
static clang::ssaf::TUSummaryExtractorRegistry::Add<
ssaf::UnsafeBufferUsageTUSummaryExtractor>
diff --git a/clang/lib/ScalableStaticAnalysisFramework/Core/Serialization/JSONFormat/JSONFormatImpl.cpp b/clang/lib/ScalableStaticAnalysisFramework/Core/Serialization/JSONFormat/JSONFormatImpl.cpp
index 8db7480e683f5..93850ad1f42b3 100644
--- a/clang/lib/ScalableStaticAnalysisFramework/Core/Serialization/JSONFormat/JSONFormatImpl.cpp
+++ b/clang/lib/ScalableStaticAnalysisFramework/Core/Serialization/JSONFormat/JSONFormatImpl.cpp
@@ -11,17 +11,22 @@
#include "clang/ScalableStaticAnalysisFramework/Core/Serialization/SerializationFormatRegistry.h"
#include "llvm/Support/Registry.h"
-// NOLINTNEXTLINE(misc-use-internal-linkage)
-volatile int SSAFJSONFormatAnchorSource = 0;
-LLVM_INSTANTIATE_REGISTRY(llvm::Registry<clang::ssaf::JSONFormat::FormatInfo>)
+using namespace clang;
+using namespace ssaf;
+
LLVM_INSTANTIATE_REGISTRY(
- llvm::Registry<clang::ssaf::JSONFormat::AnalysisResultRegistry::Codec>)
+ llvm::Registry<JSONFormat::AnalysisResultRegistry::Codec>)
+
+LLVM_INSTANTIATE_REGISTRY(llvm::Registry<JSONFormat::FormatInfo>)
-static clang::ssaf::SerializationFormatRegistry::Add<clang::ssaf::JSONFormat>
+static SerializationFormatRegistry::Add<JSONFormat>
RegisterJSONFormat("json", "JSON serialization format");
namespace clang::ssaf {
+// NOLINTNEXTLINE(misc-use-internal-linkage)
+const volatile int JSONFormatAnchorSource = 0;
+
//----------------------------------------------------------------------------
// JSON Reader and Writer
//----------------------------------------------------------------------------
diff --git a/clang/lib/ScalableStaticAnalysisFramework/Core/WholeProgramAnalysis/AnalysisRegistry.cpp b/clang/lib/ScalableStaticAnalysisFramework/Core/WholeProgramAnalysis/AnalysisRegistry.cpp
index 8e1ea954d9afd..94241afe08153 100644
--- a/clang/lib/ScalableStaticAnalysisFramework/Core/WholeProgramAnalysis/AnalysisRegistry.cpp
+++ b/clang/lib/ScalableStaticAnalysisFramework/Core/WholeProgramAnalysis/AnalysisRegistry.cpp
@@ -13,11 +13,12 @@
using namespace clang;
using namespace ssaf;
-using RegistryT = llvm::Registry<AnalysisBase>;
-
+namespace clang::ssaf {
// NOLINTNEXTLINE(misc-use-internal-linkage)
-volatile int SSAFAnalysisRegistryAnchorSource = 0;
-LLVM_INSTANTIATE_REGISTRY(RegistryT)
+const volatile int AnalysisRegistryAnchorSource = 0;
+} // namespace clang::ssaf
+
+LLVM_INSTANTIATE_REGISTRY(llvm::Registry<AnalysisBase>)
std::vector<AnalysisName> &AnalysisRegistry::getAnalysisNames() {
static std::vector<AnalysisName> Names;
@@ -34,7 +35,7 @@ const std::vector<AnalysisName> &AnalysisRegistry::names() {
llvm::Expected<std::unique_ptr<AnalysisBase>>
AnalysisRegistry::instantiate(const AnalysisName &Name) {
- for (const auto &Entry : RegistryT::entries()) {
+ for (const auto &Entry : llvm::Registry<AnalysisBase>::entries()) {
if (Entry.getName() == Name.str()) {
return std::unique_ptr<AnalysisBase>(Entry.instantiate());
}
diff --git a/clang/unittests/ScalableStaticAnalysisFramework/Frontend/TUSummaryExtractorFrontendActionTest.cpp b/clang/unittests/ScalableStaticAnalysisFramework/Frontend/TUSummaryExtractorFrontendActionTest.cpp
index 5d2392c9236a9..0635d2f8c0782 100644
--- a/clang/unittests/ScalableStaticAnalysisFramework/Frontend/TUSummaryExtractorFrontendActionTest.cpp
+++ b/clang/unittests/ScalableStaticAnalysisFramework/Frontend/TUSummaryExtractorFrontendActionTest.cpp
@@ -48,8 +48,6 @@ class NoOpExtractor : public TUSummaryExtractor {
};
} // namespace
-// NOLINTNEXTLINE(misc-use-internal-linkage)
-volatile int SSAFNoOpExtractorAnchorSource = 0;
static TUSummaryExtractorRegistry::Add<NoOpExtractor>
RegisterNoOp("NoOpExtractor", "No-op extractor for frontend action tests");
@@ -114,8 +112,6 @@ class FailingSerializationFormat final : public SerializationFormat {
};
} // namespace
-// NOLINTNEXTLINE(misc-use-internal-linkage)
-volatile int SSAFFailingSerializationFormatAnchorSource = 0;
static SerializationFormatRegistry::Add<FailingSerializationFormat>
RegisterFormat(
"FailingSerializationFormat",
diff --git a/clang/unittests/ScalableStaticAnalysisFramework/Registries/FancyAnalysisData.cpp b/clang/unittests/ScalableStaticAnalysisFramework/Registries/FancyAnalysisData.cpp
index 313c53518dfe8..084835190f7bd 100644
--- a/clang/unittests/ScalableStaticAnalysisFramework/Registries/FancyAnalysisData.cpp
+++ b/clang/unittests/ScalableStaticAnalysisFramework/Registries/FancyAnalysisData.cpp
@@ -54,8 +54,6 @@ struct FancyAnalysisFormatInfo final : FormatInfo {
};
} // namespace
-// NOLINTNEXTLINE(misc-use-internal-linkage)
-volatile int SSAFFancyAnalysisDataAnchorSource = 0;
static llvm::Registry<FormatInfo>::Add<FancyAnalysisFormatInfo>
RegisterFormatInfo("FancyAnalysisData",
"Format info for FancyAnalysisData for the "
diff --git a/clang/unittests/ScalableStaticAnalysisFramework/Registries/MockSerializationFormat.cpp b/clang/unittests/ScalableStaticAnalysisFramework/Registries/MockSerializationFormat.cpp
index 684249620e869..48c2efb08338c 100644
--- a/clang/unittests/ScalableStaticAnalysisFramework/Registries/MockSerializationFormat.cpp
+++ b/clang/unittests/ScalableStaticAnalysisFramework/Registries/MockSerializationFormat.cpp
@@ -160,8 +160,6 @@ llvm::Error MockSerializationFormat::writeTUSummary(const TUSummary &Summary,
return llvm::Error::success();
}
-// NOLINTNEXTLINE(misc-use-internal-linkage)
-volatile int SSAFMockSerializationFormatAnchorSource = 0;
static SerializationFormatRegistry::Add<MockSerializationFormat>
RegisterFormat("MockSerializationFormat",
"A serialization format for testing");
diff --git a/clang/unittests/ScalableStaticAnalysisFramework/Registries/MockSummaryExtractor1.cpp b/clang/unittests/ScalableStaticAnalysisFramework/Registries/MockSummaryExtractor1.cpp
index 1bce78c8b1030..1d5a33900d3c2 100644
--- a/clang/unittests/ScalableStaticAnalysisFramework/Registries/MockSummaryExtractor1.cpp
+++ b/clang/unittests/ScalableStaticAnalysisFramework/Registries/MockSummaryExtractor1.cpp
@@ -40,7 +40,5 @@ class MockSummaryExtractor1 : public TUSummaryExtractor {
} // namespace
-// NOLINTNEXTLINE(misc-use-internal-linkage)
-volatile int SSAFMockSummaryExtractor1AnchorSource = 0;
static TUSummaryExtractorRegistry::Add<MockSummaryExtractor1>
RegisterExtractor("MockSummaryExtractor1", "Mock summary extractor 1");
diff --git a/clang/unittests/ScalableStaticAnalysisFramework/Registries/MockSummaryExtractor2.cpp b/clang/unittests/ScalableStaticAnalysisFramework/Registries/MockSummaryExtractor2.cpp
index 242f427f5e346..ab78b5c135faa 100644
--- a/clang/unittests/ScalableStaticAnalysisFramework/Registries/MockSummaryExtractor2.cpp
+++ b/clang/unittests/ScalableStaticAnalysisFramework/Registries/MockSummaryExtractor2.cpp
@@ -40,7 +40,5 @@ class MockSummaryExtractor2 : public TUSummaryExtractor {
} // namespace
-// NOLINTNEXTLINE(misc-use-internal-linkage)
-volatile int SSAFMockSummaryExtractor2AnchorSource = 0;
static TUSummaryExtractorRegistry::Add<MockSummaryExtractor2>
RegisterExtractor("MockSummaryExtractor2", "Mock summary extractor 2");
diff --git a/clang/unittests/ScalableStaticAnalysisFramework/SSAFBuiltinTestForceLinker.h b/clang/unittests/ScalableStaticAnalysisFramework/SSAFBuiltinTestForceLinker.h
deleted file mode 100644
index 05d96af80cb27..0000000000000
--- a/clang/unittests/ScalableStaticAnalysisFramework/SSAFBuiltinTestForceLinker.h
+++ /dev/null
@@ -1,51 +0,0 @@
-//===- SSAFBuiltinTestForceLinker.h -----------------------------*- C++ -*-===//
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// This file pulls in all test-only SSAF mock extractor and format
-/// registrations by referencing their anchor symbols.
-///
-/// Include this header (with IWYU pragma: keep) in a translation unit that
-/// is compiled into the SSAF unittest binary.
-///
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_CLANG_UNITTESTS_SCALABLESTATICANALYSISFRAMEWORK_SSAFBUILTINTESTFORCELINKER_H
-#define LLVM_CLANG_UNITTESTS_SCALABLESTATICANALYSISFRAMEWORK_SSAFBUILTINTESTFORCELINKER_H
-
-// Force the linker to link NoOpExtractor registration.
-extern volatile int SSAFNoOpExtractorAnchorSource;
-[[maybe_unused]] static int SSAFNoOpExtractorAnchorDestination =
- SSAFNoOpExtractorAnchorSource;
-
-// Force the linker to link MockSummaryExtractor1 registration.
-extern volatile int SSAFMockSummaryExtractor1AnchorSource;
-[[maybe_unused]] static int SSAFMockSummaryExtractor1AnchorDestination =
- SSAFMockSummaryExtractor1AnchorSource;
-
-// Force the linker to link MockSummaryExtractor2 registration.
-extern volatile int SSAFMockSummaryExtractor2AnchorSource;
-[[maybe_unused]] static int SSAFMockSummaryExtractor2AnchorDestination =
- SSAFMockSummaryExtractor2AnchorSource;
-
-// Force the linker to link FailingSerializationFormat registration.
-extern volatile int SSAFFailingSerializationFormatAnchorSource;
-[[maybe_unused]] static int SSAFFailingSerializationFormatAnchorDestination =
- SSAFFailingSerializationFormatAnchorSource;
-
-// Force the linker to link MockSerializationFormat registration.
-extern volatile int SSAFMockSerializationFormatAnchorSource;
-[[maybe_unused]] static int SSAFMockSerializationFormatAnchorDestination =
- SSAFMockSerializationFormatAnchorSource;
-
-// Force the linker to link FancyAnalysisData format info registration.
-extern volatile int SSAFFancyAnalysisDataAnchorSource;
-[[maybe_unused]] static int SSAFFancyAnalysisDataAnchorDestination =
- SSAFFancyAnalysisDataAnchorSource;
-
-#endif // LLVM_CLANG_UNITTESTS_SCALABLESTATICANALYSISFRAMEWORK_SSAFBUILTINTESTFORCELINKER_H
diff --git a/clang/unittests/ScalableStaticAnalysisFramework/SSAFTestForceLinker.h b/clang/unittests/ScalableStaticAnalysisFramework/SSAFTestForceLinker.h
deleted file mode 100644
index dd2077569a4eb..0000000000000
--- a/clang/unittests/ScalableStaticAnalysisFramework/SSAFTestForceLinker.h
+++ /dev/null
@@ -1,23 +0,0 @@
-//===- SSAFTestForceLinker.h ------------------------------------*- C++ -*-===//
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// This file pulls in all test-only SSAF mock extractor and format
-/// registrations by referencing their anchor symbols.
-///
-/// Include this header (with IWYU pragma: keep) in a translation unit that
-/// is compiled into the SSAF unittest binary.
-///
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_CLANG_UNITTESTS_SCALABLESTATICANALYSISFRAMEWORK_SSAFTESTFORCELINKER_H
-#define LLVM_CLANG_UNITTESTS_SCALABLESTATICANALYSISFRAMEWORK_SSAFTESTFORCELINKER_H
-
-#include "SSAFBuiltinTestForceLinker.h" // IWYU pragma: keep
-
-#endif // LLVM_CLANG_UNITTESTS_SCALABLESTATICANALYSISFRAMEWORK_SSAFTESTFORCELINKER_H
diff --git a/clang/unittests/ScalableStaticAnalysisFramework/TestFixture.cpp b/clang/unittests/ScalableStaticAnalysisFramework/TestFixture.cpp
index 772eaf069a350..c1c41997abcf2 100644
--- a/clang/unittests/ScalableStaticAnalysisFramework/TestFixture.cpp
+++ b/clang/unittests/ScalableStaticAnalysisFramework/TestFixture.cpp
@@ -7,7 +7,6 @@
//===----------------------------------------------------------------------===//
#include "TestFixture.h"
-#include "SSAFBuiltinTestForceLinker.h" // IWYU pragma: keep
#include "clang/ScalableStaticAnalysisFramework/Core/Model/BuildNamespace.h"
#include "clang/ScalableStaticAnalysisFramework/Core/Model/EntityId.h"
#include "clang/ScalableStaticAnalysisFramework/Core/Model/EntityLinkage.h"
diff --git a/clang/unittests/ScalableStaticAnalysisFramework/WholeProgramAnalysis/AnalysisDriverTest.cpp b/clang/unittests/ScalableStaticAnalysisFramework/WholeProgramAnalysis/AnalysisDriverTest.cpp
index e8290a7c3cd1f..8b2c910711024 100644
--- a/clang/unittests/ScalableStaticAnalysisFramework/WholeProgramAnalysis/AnalysisDriverTest.cpp
+++ b/clang/unittests/ScalableStaticAnalysisFramework/WholeProgramAnalysis/AnalysisDriverTest.cpp
@@ -180,10 +180,6 @@ class Analysis1 final
}
};
-// These static registrations are safe without SSAFBuiltinTestForceLinker.h
-// because this translation unit is compiled directly into the test binary -
-// the linker cannot dead-strip it, so all static initializers are guaranteed
-// to run.
static AnalysisRegistry::Add<Analysis1> RegAnalysis1("Analysis for Analysis1");
class Analysis2 final
>From e85e4dd7b88bcf5ae34efd2595010020115f510e Mon Sep 17 00:00:00 2001
From: Balazs Benics <benicsbalazs at gmail.com>
Date: Tue, 28 Apr 2026 18:39:47 +0100
Subject: [PATCH 2/2] Drop "const" from these anchor variables - like they are
in clang-tidy
Turns out, MSVC likely doesn't conform with the C++ standard and makes
`const volatile` global variables have *internal* linkage - while they
should have *external* linkage.
https://eel.is/c++draft/basic.link#3.2
```
(3) The name of an entity that belongs to a namespace scope has internal linkage if it is the name of
(3.1) a variable, variable template, function, or function template that is explicitly declared static; or
(3.2) a non-template variable of non-volatile const-qualified type, unless
(3.2.1) it is declared in the purview of a module interface unit (outside the private-module-fragment, if any) or module partition, or
(3.2.2) it is explicitly declared extern, or
(3.2.3) it is inline, or
(3.2.4) it was previously declared and the prior declaration did not have internal linkage; or
```
Consequently, `const volatile` globals should NOT have *internal*
linkage, because `volatile` variables are exempt by (3.2).
---
.../developer-docs/ForceLinkerHeaders.rst | 4 ++--
.../developer-docs/HowToExtend.rst | 4 ++--
.../Core/Serialization/SerializationFormatRegistry.h | 2 +-
.../Core/TUSummary/ExtractorRegistry.h | 2 +-
.../Core/WholeProgramAnalysis/AnalysisRegistry.h | 2 +-
.../ScalableStaticAnalysisFramework/SSAFBuiltinForceLinker.h | 2 +-
.../Analyses/CallGraph/CallGraphExtractor.cpp | 2 +-
.../Analyses/CallGraph/CallGraphJSONFormat.cpp | 2 +-
.../Analyses/UnsafeBufferUsage/UnsafeBufferUsage.cpp | 2 +-
.../Analyses/UnsafeBufferUsage/UnsafeBufferUsageExtractor.cpp | 2 +-
.../Core/Serialization/JSONFormat/JSONFormatImpl.cpp | 2 +-
.../Core/WholeProgramAnalysis/AnalysisRegistry.cpp | 2 +-
12 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/clang/docs/ScalableStaticAnalysisFramework/developer-docs/ForceLinkerHeaders.rst b/clang/docs/ScalableStaticAnalysisFramework/developer-docs/ForceLinkerHeaders.rst
index d4504aa5a793a..b273264382f81 100644
--- a/clang/docs/ScalableStaticAnalysisFramework/developer-docs/ForceLinkerHeaders.rst
+++ b/clang/docs/ScalableStaticAnalysisFramework/developer-docs/ForceLinkerHeaders.rst
@@ -33,13 +33,13 @@ constructors unconditionally.
The solution: anchor symbols
****************************
-Each registration translation unit defines a ``const volatile int`` **anchor symbol**:
+Each registration translation unit defines a ``volatile int`` **anchor symbol**:
.. code-block:: c++
// In MyExtractor.cpp - next to the registry Add<> object in the ``clang::ssaf`` namespace
// NOLINTNEXTLINE(misc-use-internal-linkage)
- const volatile int MyExtractorAnchorSource = 0;
+ volatile int MyExtractorAnchorSource = 0;
For **in-tree** anchors, add a single ``ANCHOR(...)`` entry to
``BuiltinAnchorSources.def`` (in alphabetical order):
diff --git a/clang/docs/ScalableStaticAnalysisFramework/developer-docs/HowToExtend.rst b/clang/docs/ScalableStaticAnalysisFramework/developer-docs/HowToExtend.rst
index ac377813986ec..41dbe6fcbac58 100644
--- a/clang/docs/ScalableStaticAnalysisFramework/developer-docs/HowToExtend.rst
+++ b/clang/docs/ScalableStaticAnalysisFramework/developer-docs/HowToExtend.rst
@@ -55,7 +55,7 @@ Step 2: Register the extractor
namespace clang::ssaf {
// NOLINTNEXTLINE(misc-use-internal-linkage)
- const volatile int MyExtractorAnchorSource = 0;
+ volatile int MyExtractorAnchorSource = 0;
} // namespace clang::ssaf
static TUSummaryExtractorRegistry::Add<MyExtractor>
@@ -130,7 +130,7 @@ Step 2: Register the format
namespace clang::ssaf {
// NOLINTNEXTLINE(misc-use-internal-linkage)
- const volatile int MyFormatAnchorSource = 0;
+ volatile int MyFormatAnchorSource = 0;
} // namespace clang::ssaf
static SerializationFormatRegistry::Add<MyFormat>
diff --git a/clang/include/clang/ScalableStaticAnalysisFramework/Core/Serialization/SerializationFormatRegistry.h b/clang/include/clang/ScalableStaticAnalysisFramework/Core/Serialization/SerializationFormatRegistry.h
index bc146a5340339..7b6a9d103f438 100644
--- a/clang/include/clang/ScalableStaticAnalysisFramework/Core/Serialization/SerializationFormatRegistry.h
+++ b/clang/include/clang/ScalableStaticAnalysisFramework/Core/Serialization/SerializationFormatRegistry.h
@@ -26,7 +26,7 @@
//
// namespace clang::ssaf {
// // NOLINTNEXTLINE(misc-use-internal-linkage)
-// const volatile int MyFormatAnchorSource = 0;
+// volatile int MyFormatAnchorSource = 0;
// } // namespace clang::ssaf
// static SerializationFormatRegistry::Add<MyFormat>
// RegisterFormat("MyFormat", "My awesome serialization format");
diff --git a/clang/include/clang/ScalableStaticAnalysisFramework/Core/TUSummary/ExtractorRegistry.h b/clang/include/clang/ScalableStaticAnalysisFramework/Core/TUSummary/ExtractorRegistry.h
index 6af6f949a6af8..5db6541ed46e6 100644
--- a/clang/include/clang/ScalableStaticAnalysisFramework/Core/TUSummary/ExtractorRegistry.h
+++ b/clang/include/clang/ScalableStaticAnalysisFramework/Core/TUSummary/ExtractorRegistry.h
@@ -11,7 +11,7 @@
//
// namespace clang::ssaf {
// // NOLINTNEXTLINE(misc-use-internal-linkage)
-// const volatile int MyExtractorAnchorSource = 0;
+// volatile int MyExtractorAnchorSource = 0;
// } // namespace clang::ssaf
// static TUSummaryExtractorRegistry::Add<MyExtractor>
// X("MyExtractor", "My awesome extractor");
diff --git a/clang/include/clang/ScalableStaticAnalysisFramework/Core/WholeProgramAnalysis/AnalysisRegistry.h b/clang/include/clang/ScalableStaticAnalysisFramework/Core/WholeProgramAnalysis/AnalysisRegistry.h
index f747775c2c498..39375f5f4b750 100644
--- a/clang/include/clang/ScalableStaticAnalysisFramework/Core/WholeProgramAnalysis/AnalysisRegistry.h
+++ b/clang/include/clang/ScalableStaticAnalysisFramework/Core/WholeProgramAnalysis/AnalysisRegistry.h
@@ -18,7 +18,7 @@
//
// namespace clang::ssaf {
// // NOLINTNEXTLINE(misc-use-internal-linkage)
-// const volatile int MyAnalysisAnchorSource = 0;
+// volatile int MyAnalysisAnchorSource = 0;
// } // namespace clang::ssaf
//
// // Extend SSAFBuiltinForceLinker.h (or the relevant force-linker header)
diff --git a/clang/include/clang/ScalableStaticAnalysisFramework/SSAFBuiltinForceLinker.h b/clang/include/clang/ScalableStaticAnalysisFramework/SSAFBuiltinForceLinker.h
index 0bfc4356969a5..354379645a8de 100644
--- a/clang/include/clang/ScalableStaticAnalysisFramework/SSAFBuiltinForceLinker.h
+++ b/clang/include/clang/ScalableStaticAnalysisFramework/SSAFBuiltinForceLinker.h
@@ -22,7 +22,7 @@
namespace clang::ssaf {
-#define ANCHOR(NAME) extern const volatile int NAME;
+#define ANCHOR(NAME) extern volatile int NAME;
#include "BuiltinAnchorSources.def"
// Force the linker to link in the built-in SSAF registrations.
diff --git a/clang/lib/ScalableStaticAnalysisFramework/Analyses/CallGraph/CallGraphExtractor.cpp b/clang/lib/ScalableStaticAnalysisFramework/Analyses/CallGraph/CallGraphExtractor.cpp
index 3651953a413e2..25163f307a1a1 100644
--- a/clang/lib/ScalableStaticAnalysisFramework/Analyses/CallGraph/CallGraphExtractor.cpp
+++ b/clang/lib/ScalableStaticAnalysisFramework/Analyses/CallGraph/CallGraphExtractor.cpp
@@ -103,5 +103,5 @@ static TUSummaryExtractorRegistry::Add<CallGraphExtractor>
namespace clang::ssaf {
// NOLINTNEXTLINE(misc-use-internal-linkage)
-const volatile int CallGraphExtractorAnchorSource = 0;
+volatile int CallGraphExtractorAnchorSource = 0;
} // namespace clang::ssaf
diff --git a/clang/lib/ScalableStaticAnalysisFramework/Analyses/CallGraph/CallGraphJSONFormat.cpp b/clang/lib/ScalableStaticAnalysisFramework/Analyses/CallGraph/CallGraphJSONFormat.cpp
index 209b05bdb0efb..6f2414280bfaa 100644
--- a/clang/lib/ScalableStaticAnalysisFramework/Analyses/CallGraph/CallGraphJSONFormat.cpp
+++ b/clang/lib/ScalableStaticAnalysisFramework/Analyses/CallGraph/CallGraphJSONFormat.cpp
@@ -170,5 +170,5 @@ static llvm::Registry<JSONFormat::FormatInfo>::Add<CallGraphJSONFormatInfo>
namespace clang::ssaf {
// NOLINTNEXTLINE(misc-use-internal-linkage)
-const volatile int CallGraphJSONFormatAnchorSource = 0;
+volatile int CallGraphJSONFormatAnchorSource = 0;
} // namespace clang::ssaf
diff --git a/clang/lib/ScalableStaticAnalysisFramework/Analyses/UnsafeBufferUsage/UnsafeBufferUsage.cpp b/clang/lib/ScalableStaticAnalysisFramework/Analyses/UnsafeBufferUsage/UnsafeBufferUsage.cpp
index d7d4dae453e56..660376b4a8e91 100644
--- a/clang/lib/ScalableStaticAnalysisFramework/Analyses/UnsafeBufferUsage/UnsafeBufferUsage.cpp
+++ b/clang/lib/ScalableStaticAnalysisFramework/Analyses/UnsafeBufferUsage/UnsafeBufferUsage.cpp
@@ -108,5 +108,5 @@ ssaf::serializeDeserializeRoundTrip(
namespace clang::ssaf {
// NOLINTNEXTLINE(misc-use-internal-linkage)
-const volatile int UnsafeBufferUsageJSONFormatAnchorSource = 0;
+volatile int UnsafeBufferUsageJSONFormatAnchorSource = 0;
} // namespace clang::ssaf
diff --git a/clang/lib/ScalableStaticAnalysisFramework/Analyses/UnsafeBufferUsage/UnsafeBufferUsageExtractor.cpp b/clang/lib/ScalableStaticAnalysisFramework/Analyses/UnsafeBufferUsage/UnsafeBufferUsageExtractor.cpp
index ec9295d968561..b1eaa338574cc 100644
--- a/clang/lib/ScalableStaticAnalysisFramework/Analyses/UnsafeBufferUsage/UnsafeBufferUsageExtractor.cpp
+++ b/clang/lib/ScalableStaticAnalysisFramework/Analyses/UnsafeBufferUsage/UnsafeBufferUsageExtractor.cpp
@@ -100,7 +100,7 @@ void clang::ssaf::UnsafeBufferUsageTUSummaryExtractor::HandleTranslationUnit(
}
namespace clang::ssaf {
// NOLINTNEXTLINE(misc-use-internal-linkage)
-const volatile int UnsafeBufferUsageExtractorAnchorSource = 0;
+volatile int UnsafeBufferUsageExtractorAnchorSource = 0;
} // namespace clang::ssaf
static clang::ssaf::TUSummaryExtractorRegistry::Add<
diff --git a/clang/lib/ScalableStaticAnalysisFramework/Core/Serialization/JSONFormat/JSONFormatImpl.cpp b/clang/lib/ScalableStaticAnalysisFramework/Core/Serialization/JSONFormat/JSONFormatImpl.cpp
index 93850ad1f42b3..e3f7c9983f759 100644
--- a/clang/lib/ScalableStaticAnalysisFramework/Core/Serialization/JSONFormat/JSONFormatImpl.cpp
+++ b/clang/lib/ScalableStaticAnalysisFramework/Core/Serialization/JSONFormat/JSONFormatImpl.cpp
@@ -25,7 +25,7 @@ static SerializationFormatRegistry::Add<JSONFormat>
namespace clang::ssaf {
// NOLINTNEXTLINE(misc-use-internal-linkage)
-const volatile int JSONFormatAnchorSource = 0;
+volatile int JSONFormatAnchorSource = 0;
//----------------------------------------------------------------------------
// JSON Reader and Writer
diff --git a/clang/lib/ScalableStaticAnalysisFramework/Core/WholeProgramAnalysis/AnalysisRegistry.cpp b/clang/lib/ScalableStaticAnalysisFramework/Core/WholeProgramAnalysis/AnalysisRegistry.cpp
index 94241afe08153..288e94a2dc5e9 100644
--- a/clang/lib/ScalableStaticAnalysisFramework/Core/WholeProgramAnalysis/AnalysisRegistry.cpp
+++ b/clang/lib/ScalableStaticAnalysisFramework/Core/WholeProgramAnalysis/AnalysisRegistry.cpp
@@ -15,7 +15,7 @@ using namespace ssaf;
namespace clang::ssaf {
// NOLINTNEXTLINE(misc-use-internal-linkage)
-const volatile int AnalysisRegistryAnchorSource = 0;
+volatile int AnalysisRegistryAnchorSource = 0;
} // namespace clang::ssaf
LLVM_INSTANTIATE_REGISTRY(llvm::Registry<AnalysisBase>)
More information about the cfe-commits
mailing list