From b81c17092039f39be60e9656a37cffbdf2e2c783 Mon Sep 17 00:00:00 2001 From: Douglas Gregor <dgregor@apple.com> 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70240 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Frontend/PCHBitCodes.h | 9 ++++++++- include/clang/Frontend/PCHReader.h | 8 ++++++++ lib/Frontend/PCHReader.cpp | 29 ++++++++++++++++++++++++++++ lib/Frontend/PCHWriter.cpp | 21 ++++++++++++++++++++ test/PCH/ext_vector.c | 10 ++++++++++ test/PCH/ext_vector.h | 4 ++++ 6 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 test/PCH/ext_vector.c create mode 100644 test/PCH/ext_vector.h diff --git a/include/clang/Frontend/PCHBitCodes.h b/include/clang/Frontend/PCHBitCodes.h index f2aed97893..7f5e7c500f 100644 --- a/include/clang/Frontend/PCHBitCodes.h +++ b/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/include/clang/Frontend/PCHReader.h b/include/clang/Frontend/PCHReader.h index 52f58f8511..6795e2adf4 100644 --- a/include/clang/Frontend/PCHReader.h +++ b/include/clang/Frontend/PCHReader.h @@ -208,6 +208,14 @@ private: /// the the PCH file. llvm::SmallVector<uint64_t, 16> LocallyScopedExternalDecls; + /// \brief The set of ext_vector type declarations stored in the the + /// PCH file. + llvm::SmallVector<uint64_t, 4> ExtVectorDecls; + + /// \brief The set of Objective-C category definitions stored in the + /// the PCH file. + llvm::SmallVector<uint64_t, 4> ObjCCategoryImpls; + /// \brief Mapping from switch-case IDs in the PCH file to /// switch-case statements. std::map<unsigned, SwitchCase *> SwitchCaseStmts; diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index 1b26b72c5e..d044fee428 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/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<NamedDecl>(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<TypedefDecl>(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<ObjCCategoryImplDecl>(GetDecl(ObjCCategoryImpls[I]))); } IdentifierInfo* PCHReader::get(const char *NameStart, const char *NameEnd) { diff --git a/lib/Frontend/PCHWriter.cpp b/lib/Frontend/PCHWriter.cpp index 8ff688e6e3..817893448a 100644 --- a/lib/Frontend/PCHWriter.cpp +++ b/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/test/PCH/ext_vector.c b/test/PCH/ext_vector.c new file mode 100644 index 0000000000..4b5c25980e --- /dev/null +++ b/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/test/PCH/ext_vector.h b/test/PCH/ext_vector.h new file mode 100644 index 0000000000..39ab923358 --- /dev/null +++ b/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;