diff --git a/include/clang/AST/ASTContext.h b/include/clang/AST/ASTContext.h index 95073bc862..faf4cc6697 100644 --- a/include/clang/AST/ASTContext.h +++ b/include/clang/AST/ASTContext.h @@ -94,6 +94,8 @@ class ASTContext { QualType ObjCConstantStringType; RecordDecl *CFConstantStringTypeDecl; + RecordDecl *ObjCFastEnumerationStateTypeDecl; + TranslationUnitDecl *TUDecl; /// SourceMgr - The associated SourceManager object. @@ -268,6 +270,9 @@ public: return ObjCConstantStringType; } + //// This gets the struct used to keep track of fast enumerations. + QualType getObjCFastEnumerationStateType(); + // Return the ObjC type encoding for a given type. void getObjCEncodingForType(QualType t, std::string &S, llvm::SmallVector &RT) const; diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index ad820901d5..2acdfaca77 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -30,7 +30,8 @@ enum FloatingRank { ASTContext::ASTContext(const LangOptions& LOpts, SourceManager &SM, TargetInfo &t, IdentifierTable &idents, SelectorTable &sels, unsigned size_reserve) : - CFConstantStringTypeDecl(0), SourceMgr(SM), LangOpts(LOpts), Target(t), + CFConstantStringTypeDecl(0), ObjCFastEnumerationStateTypeDecl(0), + SourceMgr(SM), LangOpts(LOpts), Target(t), Idents(idents), Selectors(sels) { if (size_reserve > 0) Types.reserve(size_reserve); @@ -1371,6 +1372,32 @@ QualType ASTContext::getCFConstantStringType() { return getTagDeclType(CFConstantStringTypeDecl); } +QualType ASTContext::getObjCFastEnumerationStateType() +{ + if (!ObjCFastEnumerationStateTypeDecl) { + QualType FieldTypes[] = { + UnsignedLongTy, + getPointerType(ObjCIdType), + getPointerType(UnsignedLongTy), + getConstantArrayType(UnsignedLongTy, + llvm::APInt(32, 5), ArrayType::Normal, 0) + }; + + FieldDecl *FieldDecls[4]; + for (size_t i = 0; i < 4; ++i) + FieldDecls[i] = FieldDecl::Create(*this, SourceLocation(), 0, + FieldTypes[i]); + + ObjCFastEnumerationStateTypeDecl = + RecordDecl::Create(*this, TagDecl::TK_struct, TUDecl, SourceLocation(), + &Idents.get("__objcFastEnumerationState"), 0); + + ObjCFastEnumerationStateTypeDecl->defineBody(FieldDecls, 4); + } + + return getTagDeclType(ObjCFastEnumerationStateTypeDecl); +} + // This returns true if a type has been typedefed to BOOL: // typedef BOOL; static bool isTypeTypedefedAsBOOL(QualType T) {