]> granicus.if.org Git - clang/commitdiff
Make sure that the consumer sees all interested decls. This fixes Preview
authorDouglas Gregor <dgregor@apple.com>
Sat, 25 Apr 2009 00:41:30 +0000 (00:41 +0000)
committerDouglas Gregor <dgregor@apple.com>
Sat, 25 Apr 2009 00:41:30 +0000 (00:41 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70007 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 34cf3e12d09ca5f96054228a76a202813faf3469..941e92426fef183ce2f11028bffea87d67aad283 100644 (file)
@@ -209,6 +209,14 @@ private:
   /// \brief FIXME: document!
   llvm::SmallVector<uint64_t, 4> SpecialTypes;
 
+  /// \brief Contains declarations and definitions that will be
+  /// "interesting" to the ASTConsumer, when we get that AST consumer.
+  ///
+  /// "Interesting" declarations are those that have data that may
+  /// need to be emitted, such as inline function definitions or
+  /// Objective-C protocols.
+  llvm::SmallVector<Decl *, 16> InterestingDecls;
+
   PCHReadResult ReadPCHBlock(uint64_t &PreprocessorBlockOffset,
                              uint64_t &SelectorBlockOffset);
   bool CheckPredefinesBuffer(const char *PCHPredef, 
index b10778a1e1dfcac18c784dcab612a471c775214d..4c3e248c64afd8031bd78a3ea9bfe29a318e0d0a 100644 (file)
@@ -2404,6 +2404,20 @@ inline void PCHReader::LoadedDecl(unsigned Index, Decl *D) {
   DeclOffsets[Index] = reinterpret_cast<uint64_t>(D);
 }
 
+/// \brief Determine whether the consumer will be interested in seeing
+/// this declaration (via HandleTopLevelDecl).
+///
+/// This routine should return true for anything that might affect
+/// code generation, e.g., inline function definitions, Objective-C
+/// declarations with metadata, etc.
+static bool isConsumerInterestedIn(Decl *D) {
+  if (VarDecl *Var = dyn_cast<VarDecl>(D))
+    return Var->isFileVarDecl() && Var->getInit();
+  if (FunctionDecl *Func = dyn_cast<FunctionDecl>(D))
+    return Func->isThisDeclarationADefinition();
+  return isa<ObjCProtocolDecl>(D);
+}
+
 /// \brief Read the declaration at the given offset from the PCH file.
 Decl *PCHReader::ReadDeclRecord(uint64_t Offset, unsigned Index) {
   // Keep track of where we are in the stream, then jump back there
@@ -2581,23 +2595,15 @@ Decl *PCHReader::ReadDeclRecord(uint64_t Offset, unsigned Index) {
   }
   assert(Idx == Record.size());
 
-  if (Consumer) {
-    // If we have deserialized a declaration that has a definition the
-    // AST consumer might need to know about, notify the consumer
-    // about that definition now.
-    if (VarDecl *Var = dyn_cast<VarDecl>(D)) {
-      if (Var->isFileVarDecl() && Var->getInit()) {
-        DeclGroupRef DG(Var);
-        Consumer->HandleTopLevelDecl(DG);
-      }
-    } else if (FunctionDecl *Func = dyn_cast<FunctionDecl>(D)) {
-      if (Func->isThisDeclarationADefinition()) {
-        DeclGroupRef DG(Func);
-        Consumer->HandleTopLevelDecl(DG);
-      }
-    } else if (isa<ObjCProtocolDecl>(D)) {
+  // If we have deserialized a declaration that has a definition the
+  // AST consumer might need to know about, notify the consumer
+  // about that definition now or queue it for later.
+  if (isConsumerInterestedIn(D)) {
+    if (Consumer) {
       DeclGroupRef DG(D);
       Consumer->HandleTopLevelDecl(DG);
+    } else {
+      InterestingDecls.push_back(D);
     }
   }
 
@@ -2755,6 +2761,11 @@ void PCHReader::StartTranslationUnit(ASTConsumer *Consumer) {
     DeclGroupRef DG(D);
     Consumer->HandleTopLevelDecl(DG);
   }
+
+  for (unsigned I = 0, N = InterestingDecls.size(); I != N; ++I) {
+    DeclGroupRef DG(InterestingDecls[I]);
+    Consumer->HandleTopLevelDecl(DG);
+  }
 }
 
 void PCHReader::PrintStats() {