]> granicus.if.org Git - clang/commitdiff
PCH read/write for selector reference pool.
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 23 Jul 2010 19:11:11 +0000 (19:11 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 23 Jul 2010 19:11:11 +0000 (19:11 +0000)
Finishes off radar 6507158.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109256 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Frontend/PCHBitCodes.h
include/clang/Frontend/PCHReader.h
include/clang/Frontend/PCHWriter.h
lib/Frontend/PCHReader.cpp
lib/Frontend/PCHWriter.cpp

index 25d3f091270857224db8e911d5027d1ca0040c09..0a5196141344b18f6e1ce9f6016cafa020ad2827 100644 (file)
@@ -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.
index 8e2e3cafa63c08e28630e46d1d016e90f48099b7..17a733ce307594eef7d32c29345ea43218050bcb 100644 (file)
@@ -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<long long unsigned int,64u> ReferencedSelectorsData;
   };
 
   /// \brief The chain of PCH files. The first entry is the one named by the
index f2f3ed4a917c59756d1e7582819a62dfefee6dc9..ab6c6ef8c653e58a2f256702d2cbecf246b1123e 100644 (file)
@@ -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);
 
index 1ccd851ae3030839912cbf0c47bafc9d1a404314..b4564885a8c4402c8b1b68aa113258fdc92484e5 100644 (file)
@@ -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<CXXRecordDecl>(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) {
index b97aecbd8ca8c3d8c040caed6b18b235aede17dd..0b8c5b42582fa43de3fd16a9506fa9218aa7b8b4 100644 (file)
@@ -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<Selector, SourceLocation>::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();