[clang] [clang][bytecode] Lazily create DynamicAllocator (PR #155831)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 28 06:14:42 PDT 2025
https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/155831
Due to all the tracking via map(s) and a BumpPtrAllocator, the creating and destroying the DynamicAllocator is rather expensive. Try to do it lazily and only create it when first calling
InterpState::getAllocator().
>From 5307d713322561140ca8ec35de8ef437717cfa33 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Thu, 28 Aug 2025 12:34:16 +0200
Subject: [PATCH] [clang][bytecode] Lazily create DynamicAllocator
Due to all the tracking via map(s) and a BumpPtrAllocator, the creating
and destroying the DynamicAllocator is rather expensive. Try to do it
lazily and only create it when first calling
InterpState::getAllocator().
---
clang/lib/AST/ByteCode/InterpState.cpp | 10 +++++++---
clang/lib/AST/ByteCode/InterpState.h | 10 ++++++++--
2 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/clang/lib/AST/ByteCode/InterpState.cpp b/clang/lib/AST/ByteCode/InterpState.cpp
index f89967759ff9b..c7c96a31c4b31 100644
--- a/clang/lib/AST/ByteCode/InterpState.cpp
+++ b/clang/lib/AST/ByteCode/InterpState.cpp
@@ -59,7 +59,8 @@ InterpState::~InterpState() {
void InterpState::cleanup() {
// As a last resort, make sure all pointers still pointing to a dead block
// don't point to it anymore.
- Alloc.cleanup();
+ if (Alloc)
+ Alloc->cleanup();
}
Frame *InterpState::getCurrentFrame() {
@@ -103,10 +104,13 @@ void InterpState::deallocate(Block *B) {
}
bool InterpState::maybeDiagnoseDanglingAllocations() {
- bool NoAllocationsLeft = !Alloc.hasAllocations();
+ if (!Alloc)
+ return true;
+
+ bool NoAllocationsLeft = !Alloc->hasAllocations();
if (!checkingPotentialConstantExpression()) {
- for (const auto &[Source, Site] : Alloc.allocation_sites()) {
+ for (const auto &[Source, Site] : Alloc->allocation_sites()) {
assert(!Site.empty());
CCEDiag(Source->getExprLoc(), diag::note_constexpr_memory_leak)
diff --git a/clang/lib/AST/ByteCode/InterpState.h b/clang/lib/AST/ByteCode/InterpState.h
index 861e4c38049ab..83acbcef7095e 100644
--- a/clang/lib/AST/ByteCode/InterpState.h
+++ b/clang/lib/AST/ByteCode/InterpState.h
@@ -118,7 +118,13 @@ class InterpState final : public State, public SourceMapper {
void setEvalLocation(SourceLocation SL) { this->EvalLocation = SL; }
- DynamicAllocator &getAllocator() { return Alloc; }
+ DynamicAllocator &getAllocator() {
+ if (!Alloc) {
+ Alloc = std::make_unique<DynamicAllocator>();
+ }
+
+ return *Alloc.get();
+ }
/// Diagnose any dynamic allocations that haven't been freed yet.
/// Will return \c false if there were any allocations to diagnose,
@@ -164,7 +170,7 @@ class InterpState final : public State, public SourceMapper {
/// Reference to the offset-source mapping.
SourceMapper *M;
/// Allocator used for dynamic allocations performed via the program.
- DynamicAllocator Alloc;
+ std::unique_ptr<DynamicAllocator> Alloc;
public:
/// Reference to the module containing all bytecode.
More information about the cfe-commits
mailing list