fill in temporary smallvectors instead of vectors for performance.
Fix BuildAggrIvarLayout to not access vectors out of range.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68101 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index 2e350c8..25a9579 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -598,21 +598,20 @@
}
void ASTContext::CollectObjCIvars(const ObjCInterfaceDecl *OI,
- std::vector<FieldDecl*> &Fields) const {
+ llvm::SmallVectorImpl<FieldDecl*> &Fields) const {
const ObjCInterfaceDecl *SuperClass = OI->getSuperClass();
if (SuperClass)
CollectObjCIvars(SuperClass, Fields);
for (ObjCInterfaceDecl::ivar_iterator I = OI->ivar_begin(),
E = OI->ivar_end(); I != E; ++I) {
- ObjCIvarDecl *IVDecl = (*I);
+ ObjCIvarDecl *IVDecl = *I;
if (!IVDecl->isInvalidDecl())
Fields.push_back(cast<FieldDecl>(IVDecl));
}
// look into properties.
for (ObjCInterfaceDecl::prop_iterator I = OI->prop_begin(),
E = OI->prop_end(); I != E; ++I) {
- ObjCPropertyDecl *PDecl = (*I);
- if (ObjCIvarDecl *IV = PDecl->getPropertyIvarDecl())
+ if (ObjCIvarDecl *IV = (*I)->getPropertyIvarDecl())
Fields.push_back(cast<FieldDecl>(IV));
}
}
@@ -620,12 +619,12 @@
/// addRecordToClass - produces record info. for the class for its
/// ivars and all those inherited.
///
-const RecordDecl *ASTContext::addRecordToClass(const ObjCInterfaceDecl *D)
-{
+const RecordDecl *ASTContext::addRecordToClass(const ObjCInterfaceDecl *D) {
const RecordDecl *&RD = ASTRecordForInterface[D];
if (RD)
return RD;
- std::vector<FieldDecl*> RecFields;
+
+ llvm::SmallVector<FieldDecl*, 32> RecFields;
CollectObjCIvars(D, RecFields);
RecordDecl *NewRD = RecordDecl::Create(*this, TagDecl::TK_struct, 0,
D->getLocation(),
@@ -633,13 +632,13 @@
/// FIXME! Can do collection of ivars and adding to the record while
/// doing it.
for (unsigned int i = 0; i != RecFields.size(); i++) {
- FieldDecl *Field = FieldDecl::Create(*this, NewRD,
- RecFields[i]->getLocation(),
- RecFields[i]->getIdentifier(),
- RecFields[i]->getType(),
- RecFields[i]->getBitWidth(), false);
- NewRD->addDecl(Field);
+ NewRD->addDecl(FieldDecl::Create(*this, NewRD,
+ RecFields[i]->getLocation(),
+ RecFields[i]->getIdentifier(),
+ RecFields[i]->getType(),
+ RecFields[i]->getBitWidth(), false));
}
+
NewRD->completeDefinition(*this);
RD = NewRD;
return RD;
@@ -2401,9 +2400,9 @@
const IdentifierInfo *II = OI->getIdentifier();
S += II->getName();
S += '=';
- std::vector<FieldDecl*> RecFields;
+ llvm::SmallVector<FieldDecl*, 32> RecFields;
CollectObjCIvars(OI, RecFields);
- for (unsigned int i = 0; i != RecFields.size(); i++) {
+ for (unsigned i = 0, e = RecFields.size(); i != e; ++i) {
if (RecFields[i]->isBitField())
getObjCEncodingForTypeImpl(RecFields[i]->getType(), S, false, true,
RecFields[i]);