forked from OSchip/llvm-project
Fixes a rewriting bug where order of constructor expression arguments did not match
order of constructor arguments (all block API specific). This was exposed only in a large block literal expression in a large file where PtrSet container size execceded its limit and required reallocation. Fixes radar 7638294 llvm-svn: 95936
This commit is contained in:
parent
b1913c4df9
commit
4c4ca5a9d3
|
@ -124,8 +124,10 @@ namespace {
|
|||
llvm::DenseMap<BlockDeclRefExpr *, CallExpr *> BlockCallExprs;
|
||||
|
||||
// Block related declarations.
|
||||
llvm::SmallPtrSet<ValueDecl *, 8> BlockByCopyDecls;
|
||||
llvm::SmallPtrSet<ValueDecl *, 8> BlockByRefDecls;
|
||||
llvm::SmallVector<ValueDecl *, 8> BlockByCopyDecls;
|
||||
llvm::SmallPtrSet<ValueDecl *, 8> BlockByCopyDeclsPtrSet;
|
||||
llvm::SmallVector<ValueDecl *, 8> BlockByRefDecls;
|
||||
llvm::SmallPtrSet<ValueDecl *, 8> BlockByRefDeclsPtrSet;
|
||||
llvm::DenseMap<ValueDecl *, unsigned> BlockByRefDeclNo;
|
||||
llvm::SmallPtrSet<ValueDecl *, 8> ImportedBlockDecls;
|
||||
|
||||
|
@ -3885,7 +3887,7 @@ std::string RewriteObjC::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 (llvm::SmallPtrSet<ValueDecl*,8>::iterator I = BlockByRefDecls.begin(),
|
||||
for (llvm::SmallVector<ValueDecl*,8>::iterator I = BlockByRefDecls.begin(),
|
||||
E = BlockByRefDecls.end(); I != E; ++I) {
|
||||
S += " ";
|
||||
std::string Name = (*I)->getNameAsString();
|
||||
|
@ -3896,7 +3898,7 @@ std::string RewriteObjC::SynthesizeBlockFunc(BlockExpr *CE, int i,
|
|||
S += Name + " = __cself->" + (*I)->getNameAsString() + "; // bound by ref\n";
|
||||
}
|
||||
// Next, emit a declaration for all "by copy" declarations.
|
||||
for (llvm::SmallPtrSet<ValueDecl*,8>::iterator I = BlockByCopyDecls.begin(),
|
||||
for (llvm::SmallVector<ValueDecl*,8>::iterator I = BlockByCopyDecls.begin(),
|
||||
E = BlockByCopyDecls.end(); I != E; ++I) {
|
||||
S += " ";
|
||||
std::string Name = (*I)->getNameAsString();
|
||||
|
@ -3941,7 +3943,7 @@ std::string RewriteObjC::SynthesizeBlockHelperFuncs(BlockExpr *CE, int i,
|
|||
S += (*I)->getNameAsString();
|
||||
S += ", (void*)src->";
|
||||
S += (*I)->getNameAsString();
|
||||
if (BlockByRefDecls.count((*I)))
|
||||
if (BlockByRefDeclsPtrSet.count((*I)))
|
||||
S += ", " + utostr(BLOCK_FIELD_IS_BYREF) + "/*BLOCK_FIELD_IS_BYREF*/);";
|
||||
else
|
||||
S += ", " + utostr(BLOCK_FIELD_IS_OBJECT) + "/*BLOCK_FIELD_IS_OBJECT*/);";
|
||||
|
@ -3957,7 +3959,7 @@ std::string RewriteObjC::SynthesizeBlockHelperFuncs(BlockExpr *CE, int i,
|
|||
E = ImportedBlockDecls.end(); I != E; ++I) {
|
||||
S += "_Block_object_dispose((void*)src->";
|
||||
S += (*I)->getNameAsString();
|
||||
if (BlockByRefDecls.count((*I)))
|
||||
if (BlockByRefDeclsPtrSet.count((*I)))
|
||||
S += ", " + utostr(BLOCK_FIELD_IS_BYREF) + "/*BLOCK_FIELD_IS_BYREF*/);";
|
||||
else
|
||||
S += ", " + utostr(BLOCK_FIELD_IS_OBJECT) + "/*BLOCK_FIELD_IS_OBJECT*/);";
|
||||
|
@ -3981,7 +3983,7 @@ std::string RewriteObjC::SynthesizeBlockImpl(BlockExpr *CE, std::string Tag,
|
|||
|
||||
if (BlockDeclRefs.size()) {
|
||||
// Output all "by copy" declarations.
|
||||
for (llvm::SmallPtrSet<ValueDecl*,8>::iterator I = BlockByCopyDecls.begin(),
|
||||
for (llvm::SmallVector<ValueDecl*,8>::iterator I = BlockByCopyDecls.begin(),
|
||||
E = BlockByCopyDecls.end(); I != E; ++I) {
|
||||
S += " ";
|
||||
std::string FieldName = (*I)->getNameAsString();
|
||||
|
@ -4007,7 +4009,7 @@ std::string RewriteObjC::SynthesizeBlockImpl(BlockExpr *CE, std::string Tag,
|
|||
S += FieldName + ";\n";
|
||||
}
|
||||
// Output all "by ref" declarations.
|
||||
for (llvm::SmallPtrSet<ValueDecl*,8>::iterator I = BlockByRefDecls.begin(),
|
||||
for (llvm::SmallVector<ValueDecl*,8>::iterator I = BlockByRefDecls.begin(),
|
||||
E = BlockByRefDecls.end(); I != E; ++I) {
|
||||
S += " ";
|
||||
std::string FieldName = (*I)->getNameAsString();
|
||||
|
@ -4046,7 +4048,7 @@ std::string RewriteObjC::SynthesizeBlockImpl(BlockExpr *CE, std::string Tag,
|
|||
Constructor += " Desc = desc;\n";
|
||||
|
||||
// Initialize all "by copy" arguments.
|
||||
for (llvm::SmallPtrSet<ValueDecl*,8>::iterator I = BlockByCopyDecls.begin(),
|
||||
for (llvm::SmallVector<ValueDecl*,8>::iterator I = BlockByCopyDecls.begin(),
|
||||
E = BlockByCopyDecls.end(); I != E; ++I) {
|
||||
std::string Name = (*I)->getNameAsString();
|
||||
Constructor += " ";
|
||||
|
@ -4057,7 +4059,7 @@ std::string RewriteObjC::SynthesizeBlockImpl(BlockExpr *CE, std::string Tag,
|
|||
Constructor += Name + ";\n";
|
||||
}
|
||||
// Initialize all "by ref" arguments.
|
||||
for (llvm::SmallPtrSet<ValueDecl*,8>::iterator I = BlockByRefDecls.begin(),
|
||||
for (llvm::SmallVector<ValueDecl*,8>::iterator I = BlockByRefDecls.begin(),
|
||||
E = BlockByRefDecls.end(); I != E; ++I) {
|
||||
std::string Name = (*I)->getNameAsString();
|
||||
Constructor += " ";
|
||||
|
@ -4143,7 +4145,9 @@ void RewriteObjC::SynthesizeBlockLiterals(SourceLocation FunLocStart,
|
|||
|
||||
BlockDeclRefs.clear();
|
||||
BlockByRefDecls.clear();
|
||||
BlockByRefDeclsPtrSet.clear();
|
||||
BlockByCopyDecls.clear();
|
||||
BlockByCopyDeclsPtrSet.clear();
|
||||
BlockCallExprs.clear();
|
||||
ImportedBlockDecls.clear();
|
||||
}
|
||||
|
@ -4752,12 +4756,19 @@ void RewriteObjC::CollectBlockDeclRefInfo(BlockExpr *Exp) {
|
|||
if (BlockDeclRefs.size()) {
|
||||
// Unique all "by copy" declarations.
|
||||
for (unsigned i = 0; i < BlockDeclRefs.size(); i++)
|
||||
if (!BlockDeclRefs[i]->isByRef())
|
||||
BlockByCopyDecls.insert(BlockDeclRefs[i]->getDecl());
|
||||
if (!BlockDeclRefs[i]->isByRef()) {
|
||||
if (!BlockByCopyDeclsPtrSet.count(BlockDeclRefs[i]->getDecl())) {
|
||||
BlockByCopyDeclsPtrSet.insert(BlockDeclRefs[i]->getDecl());
|
||||
BlockByCopyDecls.push_back(BlockDeclRefs[i]->getDecl());
|
||||
}
|
||||
}
|
||||
// Unique all "by ref" declarations.
|
||||
for (unsigned i = 0; i < BlockDeclRefs.size(); i++)
|
||||
if (BlockDeclRefs[i]->isByRef()) {
|
||||
BlockByRefDecls.insert(BlockDeclRefs[i]->getDecl());
|
||||
if (!BlockByRefDeclsPtrSet.count(BlockDeclRefs[i]->getDecl())) {
|
||||
BlockByRefDeclsPtrSet.insert(BlockDeclRefs[i]->getDecl());
|
||||
BlockByRefDecls.push_back(BlockDeclRefs[i]->getDecl());
|
||||
}
|
||||
}
|
||||
// Find any imported blocks...they will need special attention.
|
||||
for (unsigned i = 0; i < BlockDeclRefs.size(); i++)
|
||||
|
@ -4835,7 +4846,7 @@ Stmt *RewriteObjC::SynthBlockInitExpr(BlockExpr *Exp) {
|
|||
if (BlockDeclRefs.size()) {
|
||||
Expr *Exp;
|
||||
// Output all "by copy" declarations.
|
||||
for (llvm::SmallPtrSet<ValueDecl*,8>::iterator I = BlockByCopyDecls.begin(),
|
||||
for (llvm::SmallVector<ValueDecl*,8>::iterator I = BlockByCopyDecls.begin(),
|
||||
E = BlockByCopyDecls.end(); I != E; ++I) {
|
||||
if (isObjCType((*I)->getType())) {
|
||||
// FIXME: Conform to ABI ([[obj retain] autorelease]).
|
||||
|
@ -4853,7 +4864,7 @@ Stmt *RewriteObjC::SynthBlockInitExpr(BlockExpr *Exp) {
|
|||
InitExprs.push_back(Exp);
|
||||
}
|
||||
// Output all "by ref" declarations.
|
||||
for (llvm::SmallPtrSet<ValueDecl*,8>::iterator I = BlockByRefDecls.begin(),
|
||||
for (llvm::SmallVector<ValueDecl*,8>::iterator I = BlockByRefDecls.begin(),
|
||||
E = BlockByRefDecls.end(); I != E; ++I) {
|
||||
ValueDecl *ND = (*I);
|
||||
std::string Name(ND->getNameAsString());
|
||||
|
@ -4893,7 +4904,9 @@ Stmt *RewriteObjC::SynthBlockInitExpr(BlockExpr *Exp) {
|
|||
NewRep);
|
||||
BlockDeclRefs.clear();
|
||||
BlockByRefDecls.clear();
|
||||
BlockByRefDeclsPtrSet.clear();
|
||||
BlockByCopyDecls.clear();
|
||||
BlockByCopyDeclsPtrSet.clear();
|
||||
ImportedBlockDecls.clear();
|
||||
return NewRep;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue