https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/204062
If the record has no pointer field, return from the function completely. >From 8116c37a64bfd1ea2c3e414b0af3e7063ad027d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <[email protected]> Date: Tue, 16 Jun 2026 07:47:25 +0200 Subject: [PATCH] [clang][bytecode] Refactor collectBlocks() If the record has no pointer field, return from the function completely. --- clang/lib/AST/ByteCode/EvaluationResult.cpp | 22 ++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/clang/lib/AST/ByteCode/EvaluationResult.cpp b/clang/lib/AST/ByteCode/EvaluationResult.cpp index 24f242758324e..149ba1f092bfa 100644 --- a/clang/lib/AST/ByteCode/EvaluationResult.cpp +++ b/clang/lib/AST/ByteCode/EvaluationResult.cpp @@ -162,7 +162,8 @@ static void collectBlocks(PtrView Ptr, llvm::SetVector<const Block *> &Blocks) { P.isDereferencable() && !P.isUnknownSizeArray() && !P.isOnePastEnd(); }; - if (!isUsefulPtr(Pointer(Ptr))) + if (!Ptr.isLive() || Ptr.isZero() || Ptr.isDummy() || + Ptr.isUnknownSizeArray() || Ptr.isOnePastEnd()) return; Blocks.insert(Ptr.Pointee); @@ -171,7 +172,9 @@ static void collectBlocks(PtrView Ptr, llvm::SetVector<const Block *> &Blocks) { if (!Desc) return; - if (const Record *R = Desc->ElemRecord; R && R->hasPtrField()) { + if (const Record *R = Desc->ElemRecord) { + if (!R->hasPtrField()) + return; for (const Record::Field &F : R->fields()) { if (!isOrHasPtr(F.Desc)) @@ -179,18 +182,27 @@ static void collectBlocks(PtrView Ptr, llvm::SetVector<const Block *> &Blocks) { PtrView FieldPtr = Ptr.atField(F.Offset); collectBlocks(FieldPtr, Blocks); } - } else if (Desc->isPrimitive() && Desc->getPrimType() == PT_Ptr) { + return; + } + + if (Desc->isPrimitive() && Desc->getPrimType() == PT_Ptr) { Pointer Pointee = Ptr.deref<Pointer>(); if (isUsefulPtr(Pointee) && !Blocks.contains(Pointee.block())) collectBlocks(Pointee.view(), Blocks); - } else if (Desc->isPrimitiveArray() && Desc->getPrimType() == PT_Ptr) { + return; + } + + if (Desc->isPrimitiveArray() && Desc->getPrimType() == PT_Ptr) { for (unsigned I = 0; I != Desc->getNumElems(); ++I) { Pointer ElemPointee = Ptr.elem<Pointer>(I); if (isUsefulPtr(ElemPointee) && !Blocks.contains(ElemPointee.block())) collectBlocks(ElemPointee.view(), Blocks); } - } else if (Desc->isCompositeArray() && isOrHasPtr(Desc->ElemDesc)) { + return; + } + + if (Desc->isCompositeArray() && isOrHasPtr(Desc->ElemDesc)) { for (unsigned I = 0; I != Desc->getNumElems(); ++I) { PtrView ElemPtr = Ptr.atIndex(I).narrow(); collectBlocks(ElemPtr, Blocks); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
