From: Fariborz Jahanian Date: Fri, 23 Jul 2010 19:11:11 +0000 (+0000) Subject: PCH read/write for selector reference pool. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=320198303df7c16950d83ae79c3f702b84badcf7;p=clang PCH read/write for selector reference pool. Finishes off radar 6507158. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109256 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Frontend/PCHBitCodes.h b/include/clang/Frontend/PCHBitCodes.h index 25d3f09127..0a51961413 100644 --- a/include/clang/Frontend/PCHBitCodes.h +++ b/include/clang/Frontend/PCHBitCodes.h @@ -236,8 +236,10 @@ namespace clang { /// \brief Record code for the chained PCH metadata, including the /// PCH version and the name of the PCH this is chained to. - CHAINED_METADATA = 26 - + CHAINED_METADATA = 26, + + /// \brief Record code for referenced selector pool. + REFERENCED_SELECTOR_POOL = 27 }; /// \brief Record types used within a source manager block. diff --git a/include/clang/Frontend/PCHReader.h b/include/clang/Frontend/PCHReader.h index 8e2e3cafa6..17a733ce30 100644 --- a/include/clang/Frontend/PCHReader.h +++ b/include/clang/Frontend/PCHReader.h @@ -281,6 +281,10 @@ private: /// \brief The number of preallocated preprocessing entities in the /// preprocessing record. unsigned NumPreallocatedPreprocessingEntities; + + /// \brief Method selectors used in a @selector expression. Used for + /// implementation of -Wselector. + llvm::SmallVector ReferencedSelectorsData; }; /// \brief The chain of PCH files. The first entry is the one named by the diff --git a/include/clang/Frontend/PCHWriter.h b/include/clang/Frontend/PCHWriter.h index f2f3ed4a91..ab6c6ef8c6 100644 --- a/include/clang/Frontend/PCHWriter.h +++ b/include/clang/Frontend/PCHWriter.h @@ -242,6 +242,7 @@ private: uint64_t WriteDeclContextVisibleBlock(ASTContext &Context, DeclContext *DC); void WriteTypeDeclOffsets(); void WriteMethodPool(Sema &SemaRef); + void WriteReferencedSelectorsPool(Sema &SemaRef); void WriteIdentifierTable(Preprocessor &PP); void WriteAttributeRecord(const Attr *Attr); diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index 1ccd851ae3..b4564885a8 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/lib/Frontend/PCHReader.cpp @@ -1630,6 +1630,13 @@ PCHReader::ReadPCHBlock(PerFileData &F) { TotalSelectorsInMethodPool = Record[1]; break; + case pch::REFERENCED_SELECTOR_POOL: { + unsigned int numEl = Record[0]*2; + for (unsigned int i = 1; i <= numEl; i++) + F.ReferencedSelectorsData.push_back(Record[i]); + } + break; + case pch::PP_COUNTER_VALUE: if (!Record.empty() && Listener) Listener->ReadCounter(Record[0]); @@ -3126,6 +3133,20 @@ void PCHReader::InitializeSema(Sema &S) { for (unsigned I = 0, N = DynamicClasses.size(); I != N; ++I) SemaObj->DynamicClasses.push_back( cast(GetDecl(DynamicClasses[I]))); + + // If there are @selector references added them to its pool. This is for + // implementation of -Wselector. + PerFileData &F = *Chain[0]; + if (!F.ReferencedSelectorsData.empty()) { + unsigned int DataSize = F.ReferencedSelectorsData.size()-1; + unsigned I = 0; + while (I < DataSize) { + Selector Sel = DecodeSelector(F.ReferencedSelectorsData[I++]); + SourceLocation SelLoc = + SourceLocation::getFromRawEncoding(F.ReferencedSelectorsData[I++]); + SemaObj->ReferencedSelectors.insert(std::make_pair(Sel, SelLoc)); + } + } } IdentifierInfo* PCHReader::get(const char *NameStart, const char *NameEnd) { diff --git a/lib/Frontend/PCHWriter.cpp b/lib/Frontend/PCHWriter.cpp index b97aecbd8c..0b8c5b4258 100644 --- a/lib/Frontend/PCHWriter.cpp +++ b/lib/Frontend/PCHWriter.cpp @@ -630,6 +630,7 @@ void PCHWriter::WriteBlockInfoBlock() { RECORD(UNUSED_STATIC_FUNCS); RECORD(MACRO_DEFINITION_OFFSETS); RECORD(CHAINED_METADATA); + RECORD(REFERENCED_SELECTOR_POOL); // SourceManager Block. BLOCK(SOURCE_MANAGER_BLOCK); @@ -1737,6 +1738,26 @@ void PCHWriter::WriteMethodPool(Sema &SemaRef) { } } +/// \brief Write the selectors referenced in @selector expression into PCH file. +void PCHWriter::WriteReferencedSelectorsPool(Sema &SemaRef) { + using namespace llvm; + if (SemaRef.ReferencedSelectors.empty()) + return; + + RecordData Record; + + Record.push_back(SemaRef.ReferencedSelectors.size()); + for (DenseMap::iterator S = + SemaRef.ReferencedSelectors.begin(), + E = SemaRef.ReferencedSelectors.end(); S != E; ++S) { + Selector Sel = (*S).first; + SourceLocation Loc = (*S).second; + AddSelectorRef(Sel, Record); + AddSourceLocation(Loc, Record); + } + Stream.EmitRecord(pch::REFERENCED_SELECTOR_POOL, Record); +} + //===----------------------------------------------------------------------===// // Identifier Table Serialization //===----------------------------------------------------------------------===// @@ -2247,6 +2268,7 @@ void PCHWriter::WritePCHCore(Sema &SemaRef, MemorizeStatCalls *StatCalls, WritePreprocessor(PP); WriteMethodPool(SemaRef); + WriteReferencedSelectorsPool(SemaRef); WriteIdentifierTable(PP); WriteTypeDeclOffsets();