https://github.com/kazutakahirata created https://github.com/llvm/llvm-project/pull/107743
We could also use range-based for loops at several places, but I'm leaving that to a subsequent patch. >From cb2cc5934488f75664eee61b26a9a3ce3f27010c Mon Sep 17 00:00:00 2001 From: Kazu Hirata <k...@google.com> Date: Sun, 8 Sep 2024 00:48:25 -0700 Subject: [PATCH] [FrontEnd] Use SetVector for BlockByCopyDecls (NFC) We could also use range-based for loops at several places, but I'm leaving that to a subsequent patch. --- .../Frontend/Rewrite/RewriteModernObjC.cpp | 88 ++++++++++--------- 1 file changed, 45 insertions(+), 43 deletions(-) diff --git a/clang/lib/Frontend/Rewrite/RewriteModernObjC.cpp b/clang/lib/Frontend/Rewrite/RewriteModernObjC.cpp index 31ec86e2e4f096..c6539658669ef3 100644 --- a/clang/lib/Frontend/Rewrite/RewriteModernObjC.cpp +++ b/clang/lib/Frontend/Rewrite/RewriteModernObjC.cpp @@ -138,10 +138,8 @@ namespace { SmallVector<DeclRefExpr *, 32> BlockDeclRefs; // Block related declarations. - SmallVector<ValueDecl *, 8> BlockByCopyDecls; - llvm::SmallPtrSet<ValueDecl *, 8> BlockByCopyDeclsPtrSet; - SmallVector<ValueDecl *, 8> BlockByRefDecls; - llvm::SmallPtrSet<ValueDecl *, 8> BlockByRefDeclsPtrSet; + llvm::SmallSetVector<ValueDecl *, 8> BlockByCopyDecls; + llvm::SmallSetVector<ValueDecl *, 8> BlockByRefDecls; llvm::DenseMap<ValueDecl *, unsigned> BlockByRefDeclNo; llvm::SmallPtrSet<ValueDecl *, 8> ImportedBlockDecls; llvm::SmallPtrSet<VarDecl *, 8> ImportedLocalExternalDecls; @@ -4082,8 +4080,10 @@ std::string RewriteModernObjC::SynthesizeBlockFunc(BlockExpr *CE, int i, // Create local declarations to avoid rewriting all closure decl ref exprs. // First, emit a declaration for all "by ref" decls. - for (SmallVectorImpl<ValueDecl *>::iterator I = BlockByRefDecls.begin(), - E = BlockByRefDecls.end(); I != E; ++I) { + for (llvm::SmallSetVector<ValueDecl *, 8>::iterator + I = BlockByRefDecls.begin(), + E = BlockByRefDecls.end(); + I != E; ++I) { S += " "; std::string Name = (*I)->getNameAsString(); std::string TypeString; @@ -4093,8 +4093,10 @@ std::string RewriteModernObjC::SynthesizeBlockFunc(BlockExpr *CE, int i, S += Name + " = __cself->" + (*I)->getNameAsString() + "; // bound by ref\n"; } // Next, emit a declaration for all "by copy" declarations. - for (SmallVectorImpl<ValueDecl *>::iterator I = BlockByCopyDecls.begin(), - E = BlockByCopyDecls.end(); I != E; ++I) { + for (llvm::SmallSetVector<ValueDecl *, 8>::iterator + I = BlockByCopyDecls.begin(), + E = BlockByCopyDecls.end(); + I != E; ++I) { S += " "; // Handle nested closure invocation. For example: // @@ -4146,7 +4148,7 @@ std::string RewriteModernObjC::SynthesizeBlockHelperFuncs( S += VD->getNameAsString(); S += ", (void*)src->"; S += VD->getNameAsString(); - if (BlockByRefDeclsPtrSet.count(VD)) + if (BlockByRefDecls.count(VD)) S += ", " + utostr(BLOCK_FIELD_IS_BYREF) + "/*BLOCK_FIELD_IS_BYREF*/);"; else if (VD->getType()->isBlockPointerType()) S += ", " + utostr(BLOCK_FIELD_IS_BLOCK) + "/*BLOCK_FIELD_IS_BLOCK*/);"; @@ -4163,7 +4165,7 @@ std::string RewriteModernObjC::SynthesizeBlockHelperFuncs( for (ValueDecl *VD : ImportedBlockDecls) { S += "_Block_object_dispose((void*)src->"; S += VD->getNameAsString(); - if (BlockByRefDeclsPtrSet.count(VD)) + if (BlockByRefDecls.count(VD)) S += ", " + utostr(BLOCK_FIELD_IS_BYREF) + "/*BLOCK_FIELD_IS_BYREF*/);"; else if (VD->getType()->isBlockPointerType()) S += ", " + utostr(BLOCK_FIELD_IS_BLOCK) + "/*BLOCK_FIELD_IS_BLOCK*/);"; @@ -4190,8 +4192,10 @@ std::string RewriteModernObjC::SynthesizeBlockImpl(BlockExpr *CE, if (BlockDeclRefs.size()) { // Output all "by copy" declarations. - for (SmallVectorImpl<ValueDecl *>::iterator I = BlockByCopyDecls.begin(), - E = BlockByCopyDecls.end(); I != E; ++I) { + for (llvm::SmallSetVector<ValueDecl *, 8>::iterator + I = BlockByCopyDecls.begin(), + E = BlockByCopyDecls.end(); + I != E; ++I) { S += " "; std::string FieldName = (*I)->getNameAsString(); std::string ArgName = "_" + FieldName; @@ -4219,8 +4223,10 @@ std::string RewriteModernObjC::SynthesizeBlockImpl(BlockExpr *CE, S += FieldName + ";\n"; } // Output all "by ref" declarations. - for (SmallVectorImpl<ValueDecl *>::iterator I = BlockByRefDecls.begin(), - E = BlockByRefDecls.end(); I != E; ++I) { + for (llvm::SmallSetVector<ValueDecl *, 8>::iterator + I = BlockByRefDecls.begin(), + E = BlockByRefDecls.end(); + I != E; ++I) { S += " "; std::string FieldName = (*I)->getNameAsString(); std::string ArgName = "_" + FieldName; @@ -4238,8 +4244,10 @@ std::string RewriteModernObjC::SynthesizeBlockImpl(BlockExpr *CE, Constructor += ", int flags=0)"; // Initialize all "by copy" arguments. bool firsTime = true; - for (SmallVectorImpl<ValueDecl *>::iterator I = BlockByCopyDecls.begin(), - E = BlockByCopyDecls.end(); I != E; ++I) { + for (llvm::SmallSetVector<ValueDecl *, 8>::iterator + I = BlockByCopyDecls.begin(), + E = BlockByCopyDecls.end(); + I != E; ++I) { std::string Name = (*I)->getNameAsString(); if (firsTime) { Constructor += " : "; @@ -4253,8 +4261,10 @@ std::string RewriteModernObjC::SynthesizeBlockImpl(BlockExpr *CE, Constructor += Name + "(_" + Name + ")"; } // Initialize all "by ref" arguments. - for (SmallVectorImpl<ValueDecl *>::iterator I = BlockByRefDecls.begin(), - E = BlockByRefDecls.end(); I != E; ++I) { + for (llvm::SmallSetVector<ValueDecl *, 8>::iterator + I = BlockByRefDecls.begin(), + E = BlockByRefDecls.end(); + I != E; ++I) { std::string Name = (*I)->getNameAsString(); if (firsTime) { Constructor += " : "; @@ -4340,13 +4350,11 @@ void RewriteModernObjC::SynthesizeBlockLiterals(SourceLocation FunLocStart, ValueDecl *VD = Exp->getDecl(); BlockDeclRefs.push_back(Exp); if (!VD->hasAttr<BlocksAttr>()) { - if (BlockByCopyDeclsPtrSet.insert(VD).second) - BlockByCopyDecls.push_back(VD); + BlockByCopyDecls.insert(VD); continue; } - if (BlockByRefDeclsPtrSet.insert(VD).second) - BlockByRefDecls.push_back(VD); + BlockByRefDecls.insert(VD); // imported objects in the inner blocks not used in the outer // blocks must be copied/disposed in the outer block as well. @@ -4376,9 +4384,7 @@ void RewriteModernObjC::SynthesizeBlockLiterals(SourceLocation FunLocStart, BlockDeclRefs.clear(); BlockByRefDecls.clear(); - BlockByRefDeclsPtrSet.clear(); BlockByCopyDecls.clear(); - BlockByCopyDeclsPtrSet.clear(); ImportedBlockDecls.clear(); } if (RewriteSC) { @@ -5157,14 +5163,12 @@ void RewriteModernObjC::CollectBlockDeclRefInfo(BlockExpr *Exp) { // Unique all "by copy" declarations. for (unsigned i = 0; i < BlockDeclRefs.size(); i++) if (!BlockDeclRefs[i]->getDecl()->hasAttr<BlocksAttr>()) { - if (BlockByCopyDeclsPtrSet.insert(BlockDeclRefs[i]->getDecl()).second) - BlockByCopyDecls.push_back(BlockDeclRefs[i]->getDecl()); + BlockByCopyDecls.insert(BlockDeclRefs[i]->getDecl()); } // Unique all "by ref" declarations. for (unsigned i = 0; i < BlockDeclRefs.size(); i++) if (BlockDeclRefs[i]->getDecl()->hasAttr<BlocksAttr>()) { - if (BlockByRefDeclsPtrSet.insert(BlockDeclRefs[i]->getDecl()).second) - BlockByRefDecls.push_back(BlockDeclRefs[i]->getDecl()); + BlockByRefDecls.insert(BlockDeclRefs[i]->getDecl()); } // Find any imported blocks...they will need special attention. for (unsigned i = 0; i < BlockDeclRefs.size(); i++) @@ -5197,20 +5201,16 @@ Stmt *RewriteModernObjC::SynthBlockInitExpr(BlockExpr *Exp, for (unsigned i = 0; i < InnerBlockDeclRefs.size(); i++) { DeclRefExpr *Exp = InnerBlockDeclRefs[i]; ValueDecl *VD = Exp->getDecl(); - if (!VD->hasAttr<BlocksAttr>() && !BlockByCopyDeclsPtrSet.count(VD)) { - // We need to save the copied-in variables in nested - // blocks because it is needed at the end for some of the API generations. - // See SynthesizeBlockLiterals routine. + if (!VD->hasAttr<BlocksAttr>() && BlockByCopyDecls.insert(VD)) { + // We need to save the copied-in variables in nested + // blocks because it is needed at the end for some of the API + // generations. See SynthesizeBlockLiterals routine. InnerDeclRefs.push_back(Exp); countOfInnerDecls++; BlockDeclRefs.push_back(Exp); - BlockByCopyDeclsPtrSet.insert(VD); - BlockByCopyDecls.push_back(VD); } - if (VD->hasAttr<BlocksAttr>() && !BlockByRefDeclsPtrSet.count(VD)) { + if (VD->hasAttr<BlocksAttr>() && BlockByRefDecls.insert(VD)) { InnerDeclRefs.push_back(Exp); countOfInnerDecls++; BlockDeclRefs.push_back(Exp); - BlockByRefDeclsPtrSet.insert(VD); - BlockByRefDecls.push_back(VD); } } // Find any imported blocks...they will need special attention. @@ -5291,8 +5291,10 @@ Stmt *RewriteModernObjC::SynthBlockInitExpr(BlockExpr *Exp, if (BlockDeclRefs.size()) { Expr *Exp; // Output all "by copy" declarations. - for (SmallVectorImpl<ValueDecl *>::iterator I = BlockByCopyDecls.begin(), - E = BlockByCopyDecls.end(); I != E; ++I) { + for (llvm::SmallSetVector<ValueDecl *, 8>::iterator + I = BlockByCopyDecls.begin(), + E = BlockByCopyDecls.end(); + I != E; ++I) { if (isObjCType((*I)->getType())) { // FIXME: Conform to ABI ([[obj retain] autorelease]). FD = SynthBlockInitFunctionDecl((*I)->getName()); @@ -5329,8 +5331,10 @@ Stmt *RewriteModernObjC::SynthBlockInitExpr(BlockExpr *Exp, InitExprs.push_back(Exp); } // Output all "by ref" declarations. - for (SmallVectorImpl<ValueDecl *>::iterator I = BlockByRefDecls.begin(), - E = BlockByRefDecls.end(); I != E; ++I) { + for (llvm::SmallSetVector<ValueDecl *, 8>::iterator + I = BlockByRefDecls.begin(), + E = BlockByRefDecls.end(); + I != E; ++I) { ValueDecl *ND = (*I); std::string Name(ND->getNameAsString()); std::string RecName; @@ -5398,9 +5402,7 @@ Stmt *RewriteModernObjC::SynthBlockInitExpr(BlockExpr *Exp, BlockDeclRefs.clear(); BlockByRefDecls.clear(); - BlockByRefDeclsPtrSet.clear(); BlockByCopyDecls.clear(); - BlockByCopyDeclsPtrSet.clear(); ImportedBlockDecls.clear(); return NewRep; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits