[clang] [CIR][CodeGen][NFC] Move ast helper function to FunctionUtils (PR #226877)
Jiahao Guo via cfe-commits
cfe-commits at lists.llvm.org
Sun Sep 27 20:55:39 PDT 2026
https://github.com/E00N777 created https://github.com/llvm/llvm-project/pull/226877
Follow-up to PR : https://github.com/llvm/llvm-project/pull/223418.
Move emit Lifetime marker helper function to FunctionUtils.
Assisted by : Codex gpt-6-Sol
>From 55a6cb8d17da05d7247e13a9384c589f111114ca Mon Sep 17 00:00:00 2001
From: E00N777 <E0N_gjh at 163.com>
Date: Mon, 28 Sep 2026 11:43:58 +0800
Subject: [PATCH] [CIR][CodeGen][NFC] Move ast helper function to FunctionUtils
---
clang/include/clang/CodeGenUtils/FunctionUtils.h | 8 ++++++++
clang/lib/CIR/CodeGen/CIRGenFunction.cpp | 16 +---------------
clang/lib/CodeGenUtils/FunctionUtils.cpp | 13 +++++++++++++
3 files changed, 22 insertions(+), 15 deletions(-)
diff --git a/clang/include/clang/CodeGenUtils/FunctionUtils.h b/clang/include/clang/CodeGenUtils/FunctionUtils.h
index f924874d829e0..faec209105521 100644
--- a/clang/include/clang/CodeGenUtils/FunctionUtils.h
+++ b/clang/include/clang/CodeGenUtils/FunctionUtils.h
@@ -17,12 +17,20 @@
#include "clang/Basic/CodeGenOptions.h"
#include "clang/Basic/LangOptions.h"
+namespace clang {
+class Stmt;
+}
+
namespace clang::CodeGenUtils {
/// Decide whether we need to emit the lifetime markers.
bool shouldEmitLifetimeMarkers(const CodeGenOptions &CGOpts,
const LangOptions &LangOpts);
+/// Whether the statement tree contains a construct that may bypass a local's
+/// initialization. Used to conservatively suppress lifetime markers.
+bool functionMightHaveBypass(const Stmt *S);
+
} // namespace clang::CodeGenUtils
#endif // LLVM_CLANG_CODEGENUTILS_FUNCTIONUTILS_H
diff --git a/clang/lib/CIR/CodeGen/CIRGenFunction.cpp b/clang/lib/CIR/CodeGen/CIRGenFunction.cpp
index 333610196c796..30caa2a455a07 100644
--- a/clang/lib/CIR/CodeGen/CIRGenFunction.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenFunction.cpp
@@ -30,20 +30,6 @@
namespace clang::CIRGen {
-/// Does the statement tree rooted at \p s contain a label, switch, or indirect
-/// goto that could bypass a local's initialization? A coarse stand-in for
-/// classic CodeGen's per-decl bypass analysis (PR28267).
-static bool functionMightHaveBypass(const Stmt *s) {
- if (!s)
- return false;
- if (isa<LabelStmt, SwitchStmt, IndirectGotoStmt>(s))
- return true;
- for (const Stmt *child : s->children())
- if (functionMightHaveBypass(child))
- return true;
- return false;
-}
-
CIRGenFunction::CIRGenFunction(CIRGenModule &cgm, CIRGenBuilderTy &builder,
bool suppressNewContext)
: CIRGenTypeCache(cgm), cgm{cgm}, builder(builder),
@@ -780,7 +766,7 @@ cir::FuncOp CIRGenFunction::generateCode(clang::GlobalDecl gd, cir::FuncOp fn,
llvm::append_range(fnArgs, funcDecl->parameters());
if (shouldEmitLifetimeMarkers)
- fnHasBypassStmt = functionMightHaveBypass(body);
+ fnHasBypassStmt = CodeGenUtils::functionMightHaveBypass(body);
if (isa<CXXDestructorDecl>(funcDecl)) {
emitDestructorBody(args);
diff --git a/clang/lib/CodeGenUtils/FunctionUtils.cpp b/clang/lib/CodeGenUtils/FunctionUtils.cpp
index 9f01745abbf82..1d78576e44512 100644
--- a/clang/lib/CodeGenUtils/FunctionUtils.cpp
+++ b/clang/lib/CodeGenUtils/FunctionUtils.cpp
@@ -7,6 +7,8 @@
//===----------------------------------------------------------------------===//
#include "clang/CodeGenUtils/FunctionUtils.h"
+#include "clang/AST/Stmt.h"
+#include "llvm/Support/Casting.h"
namespace clang::CodeGenUtils {
@@ -26,4 +28,15 @@ bool shouldEmitLifetimeMarkers(const CodeGenOptions &CGOpts,
return CGOpts.OptimizationLevel != 0;
}
+bool functionMightHaveBypass(const Stmt *S) {
+ if (!S)
+ return false;
+ if (llvm::isa<LabelStmt, SwitchStmt, IndirectGotoStmt>(S))
+ return true;
+ for (const Stmt *Child : S->children())
+ if (functionMightHaveBypass(Child))
+ return true;
+ return false;
+}
+
} // namespace clang::CodeGenUtils
More information about the cfe-commits
mailing list