From 61cac2b2954cf20760b609fc3efd1c976183cf9b Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Mon, 27 Apr 2009 20:06:05 +0000 Subject: [PATCH] Add Sema::ExtVectorDecls and Sema::ObjCCategoryImpls to the PCH file. Since these vectors are very, very rarely used and, when used in headers, and even when used are relatively small, we load them eagerly. llvm-svn: 70240 --- clang/include/clang/Frontend/PCHBitCodes.h | 9 ++++++- clang/include/clang/Frontend/PCHReader.h | 8 ++++++ clang/lib/Frontend/PCHReader.cpp | 29 ++++++++++++++++++++++ clang/lib/Frontend/PCHWriter.cpp | 21 ++++++++++++++++ clang/test/PCH/ext_vector.c | 10 ++++++++ clang/test/PCH/ext_vector.h | 4 +++ 6 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 clang/test/PCH/ext_vector.c create mode 100644 clang/test/PCH/ext_vector.h diff --git a/clang/include/clang/Frontend/PCHBitCodes.h b/clang/include/clang/Frontend/PCHBitCodes.h index f2aed97893fe..7f5e7c500f57 100644 --- a/clang/include/clang/Frontend/PCHBitCodes.h +++ b/clang/include/clang/Frontend/PCHBitCodes.h @@ -188,7 +188,14 @@ namespace clang { SOURCE_LOCATION_PRELOADS = 16, /// \brief Record code for the stat() cache. - STAT_CACHE = 17 + STAT_CACHE = 17, + + /// \brief Record code for the set of ext_vector type names. + EXT_VECTOR_DECLS = 18, + + /// \brief Record code for the set of Objective-C category + /// implementations. + OBJC_CATEGORY_IMPLEMENTATIONS = 19 }; /// \brief Record types used within a source manager block. diff --git a/clang/include/clang/Frontend/PCHReader.h b/clang/include/clang/Frontend/PCHReader.h index 52f58f851143..6795e2adf474 100644 --- a/clang/include/clang/Frontend/PCHReader.h +++ b/clang/include/clang/Frontend/PCHReader.h @@ -208,6 +208,14 @@ private: /// the the PCH file. llvm::SmallVector LocallyScopedExternalDecls; + /// \brief The set of ext_vector type declarations stored in the the + /// PCH file. + llvm::SmallVector ExtVectorDecls; + + /// \brief The set of Objective-C category definitions stored in the + /// the PCH file. + llvm::SmallVector ObjCCategoryImpls; + /// \brief Mapping from switch-case IDs in the PCH file to /// switch-case statements. std::map SwitchCaseStmts; diff --git a/clang/lib/Frontend/PCHReader.cpp b/clang/lib/Frontend/PCHReader.cpp index 1b26b72c5ec7..d044fee42806 100644 --- a/clang/lib/Frontend/PCHReader.cpp +++ b/clang/lib/Frontend/PCHReader.cpp @@ -1038,6 +1038,22 @@ PCHReader::ReadPCHBlock() { (const unsigned char *)BlobStart, NumStatHits, NumStatMisses)); break; + + case pch::EXT_VECTOR_DECLS: + if (!ExtVectorDecls.empty()) { + Error("Duplicate EXT_VECTOR_DECLS record in PCH file"); + return Failure; + } + ExtVectorDecls.swap(Record); + break; + + case pch::OBJC_CATEGORY_IMPLEMENTATIONS: + if (!ObjCCategoryImpls.empty()) { + Error("Duplicate OBJC_CATEGORY_IMPLEMENTATIONS record in PCH file"); + return Failure; + } + ObjCCategoryImpls.swap(Record); + break; } } Error("Premature end of bitstream"); @@ -1703,6 +1719,19 @@ void PCHReader::InitializeSema(Sema &S) { NamedDecl *D = cast(GetDecl(LocallyScopedExternalDecls[I])); SemaObj->LocallyScopedExternalDecls[D->getDeclName()] = D; } + + // If there were any ext_vector type declarations, deserialize them + // and add them to Sema's vector of such declarations. + for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) + SemaObj->ExtVectorDecls.push_back( + cast(GetDecl(ExtVectorDecls[I]))); + + // If there were any Objective-C category implementations, + // deserialize them and add them to Sema's vector of such + // definitions. + for (unsigned I = 0, N = ObjCCategoryImpls.size(); I != N; ++I) + SemaObj->ObjCCategoryImpls.push_back( + cast(GetDecl(ObjCCategoryImpls[I]))); } IdentifierInfo* PCHReader::get(const char *NameStart, const char *NameEnd) { diff --git a/clang/lib/Frontend/PCHWriter.cpp b/clang/lib/Frontend/PCHWriter.cpp index 8ff688e6e367..817893448a70 100644 --- a/clang/lib/Frontend/PCHWriter.cpp +++ b/clang/lib/Frontend/PCHWriter.cpp @@ -355,6 +355,8 @@ void PCHWriter::WriteBlockInfoBlock() { RECORD(SOURCE_LOCATION_OFFSETS); RECORD(SOURCE_LOCATION_PRELOADS); RECORD(STAT_CACHE); + RECORD(EXT_VECTOR_DECLS); + RECORD(OBJC_CATEGORY_IMPLEMENTATIONS); // SourceManager Block. BLOCK(SOURCE_MANAGER_BLOCK); @@ -1656,6 +1658,17 @@ void PCHWriter::WritePCH(Sema &SemaRef, MemorizeStatCalls *StatCalls) { TD != TDEnd; ++TD) AddDeclRef(TD->second, LocallyScopedExternalDecls); + // Build a record containing all of the ext_vector declarations. + RecordData ExtVectorDecls; + for (unsigned I = 0, N = SemaRef.ExtVectorDecls.size(); I != N; ++I) + AddDeclRef(SemaRef.ExtVectorDecls[I], ExtVectorDecls); + + // Build a record containing all of the Objective-C category + // implementations. + RecordData ObjCCategoryImpls; + for (unsigned I = 0, N = SemaRef.ObjCCategoryImpls.size(); I != N; ++I) + AddDeclRef(SemaRef.ObjCCategoryImpls[I], ObjCCategoryImpls); + // Write the remaining PCH contents. RecordData Record; Stream.EnterSubblock(pch::PCH_BLOCK_ID, 4); @@ -1727,6 +1740,14 @@ void PCHWriter::WritePCH(Sema &SemaRef, MemorizeStatCalls *StatCalls) { if (!LocallyScopedExternalDecls.empty()) Stream.EmitRecord(pch::LOCALLY_SCOPED_EXTERNAL_DECLS, LocallyScopedExternalDecls); + + // Write the record containing ext_vector type names. + if (!ExtVectorDecls.empty()) + Stream.EmitRecord(pch::EXT_VECTOR_DECLS, ExtVectorDecls); + + // Write the record containing Objective-C category implementations. + if (!ObjCCategoryImpls.empty()) + Stream.EmitRecord(pch::OBJC_CATEGORY_IMPLEMENTATIONS, ObjCCategoryImpls); // Some simple statistics Record.clear(); diff --git a/clang/test/PCH/ext_vector.c b/clang/test/PCH/ext_vector.c new file mode 100644 index 000000000000..4b5c25980e56 --- /dev/null +++ b/clang/test/PCH/ext_vector.c @@ -0,0 +1,10 @@ +// Test this without pch. +// RUN: clang-cc -include %S/ext_vector.h -fsyntax-only -verify %s && + +// Test with pch. +// RUN: clang-cc -emit-pch -o %t %S/ext_vector.h && +// RUN: clang-cc -include-pch %t -fsyntax-only -verify %s + +int test(float4 f4) { + return f4.xy; // expected-error{{float2}} +} diff --git a/clang/test/PCH/ext_vector.h b/clang/test/PCH/ext_vector.h new file mode 100644 index 000000000000..39ab9233584d --- /dev/null +++ b/clang/test/PCH/ext_vector.h @@ -0,0 +1,4 @@ +// Header file for ext_vector.c PCH test + +typedef __attribute__((ext_vector_type(2))) float float2; +typedef __attribute__((ext_vector_type(4))) float float4;