[llvm-branch-commits] [FlowSensitive] Allow callback to initialize storagelocations (PR #164675)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Oct 22 10:55:58 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Florian Mayer (fmayer)
<details>
<summary>Changes</summary>
This is useful to make sure that a newly created StorageLocation always
has e.g. an uninitialized boolean.
---
Full diff: https://github.com/llvm/llvm-project/pull/164675.diff
2 Files Affected:
- (modified) clang/include/clang/Analysis/FlowSensitive/DataflowAnalysisContext.h (+7)
- (modified) clang/lib/Analysis/FlowSensitive/DataflowAnalysisContext.cpp (+7-2)
``````````diff
diff --git a/clang/include/clang/Analysis/FlowSensitive/DataflowAnalysisContext.h b/clang/include/clang/Analysis/FlowSensitive/DataflowAnalysisContext.h
index 11042e865c4e6..57dfabaa16212 100644
--- a/clang/include/clang/Analysis/FlowSensitive/DataflowAnalysisContext.h
+++ b/clang/include/clang/Analysis/FlowSensitive/DataflowAnalysisContext.h
@@ -111,6 +111,12 @@ class DataflowAnalysisContext {
SyntheticFieldCallback = CB;
}
+ void setInitializerCallback(
+ std::function<void(QualType, StorageLocation&)> CB) {
+ assert(!RecordStorageLocationCreated);
+ InitializerCallback = CB;
+ }
+
/// Returns a new storage location appropriate for `Type`.
///
/// A null `Type` is interpreted as the pointee type of `std::nullptr_t`.
@@ -332,6 +338,7 @@ class DataflowAnalysisContext {
std::unique_ptr<Logger> LogOwner; // If created via flags.
std::function<llvm::StringMap<QualType>(QualType)> SyntheticFieldCallback;
+ std::optional<std::function<void(QualType, StorageLocation&)>> InitializerCallback;
/// Has any `RecordStorageLocation` been created yet?
bool RecordStorageLocationCreated = false;
diff --git a/clang/lib/Analysis/FlowSensitive/DataflowAnalysisContext.cpp b/clang/lib/Analysis/FlowSensitive/DataflowAnalysisContext.cpp
index 4196d6821c184..1b1b41f1f3160 100644
--- a/clang/lib/Analysis/FlowSensitive/DataflowAnalysisContext.cpp
+++ b/clang/lib/Analysis/FlowSensitive/DataflowAnalysisContext.cpp
@@ -59,6 +59,7 @@ void DataflowAnalysisContext::addModeledFields(const FieldSet &Fields) {
}
StorageLocation &DataflowAnalysisContext::createStorageLocation(QualType Type) {
+ StorageLocation *S;
if (!Type.isNull() && Type->isRecordType()) {
llvm::DenseMap<const ValueDecl *, StorageLocation *> FieldLocs;
for (const FieldDecl *Field : getModeledFields(Type))
@@ -74,10 +75,14 @@ StorageLocation &DataflowAnalysisContext::createStorageLocation(QualType Type) {
{Entry.getKey(),
&createStorageLocation(Entry.getValue().getNonReferenceType())});
- return createRecordStorageLocation(Type, std::move(FieldLocs),
+ S = &createRecordStorageLocation(Type, std::move(FieldLocs),
std::move(SyntheticFields));
+ } else {
+ S = &arena().create<ScalarStorageLocation>(Type);
}
- return arena().create<ScalarStorageLocation>(Type);
+ if (InitializerCallback)
+ (*InitializerCallback)(Type, *S);
+ return *S;
}
// Returns the keys for a given `StringMap`.
``````````
</details>
https://github.com/llvm/llvm-project/pull/164675
More information about the llvm-branch-commits
mailing list