diff options
-rw-r--r-- | clang/include/clang/AST/ASTContext.h | 5 | ||||
-rw-r--r-- | clang/lib/AST/ASTContext.cpp | 29 |
2 files changed, 33 insertions, 1 deletions
diff --git a/clang/include/clang/AST/ASTContext.h b/clang/include/clang/AST/ASTContext.h index 95073bc8625..faf4cc66971 100644 --- a/clang/include/clang/AST/ASTContext.h +++ b/clang/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<const RecordType*,8> &RT) const; diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index ad820901d5c..2acdfaca77f 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/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 <type> BOOL; static bool isTypeTypedefedAsBOOL(QualType T) { |