diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Frontend/PCHReader.cpp | 23 | ||||
-rw-r--r-- | clang/lib/Frontend/PCHWriter.cpp | 17 |
2 files changed, 21 insertions, 19 deletions
diff --git a/clang/lib/Frontend/PCHReader.cpp b/clang/lib/Frontend/PCHReader.cpp index 976b98dd11c..c6c34e9749f 100644 --- a/clang/lib/Frontend/PCHReader.cpp +++ b/clang/lib/Frontend/PCHReader.cpp @@ -377,9 +377,7 @@ void PCHDeclReader::VisitBlockDecl(BlockDecl *BD) { std::pair<uint64_t, uint64_t> PCHDeclReader::VisitDeclContext(DeclContext *DC) { uint64_t LexicalOffset = Record[Idx++]; - uint64_t VisibleOffset = 0; - if (DC->getPrimaryContext() == DC) - VisibleOffset = Record[Idx++]; + uint64_t VisibleOffset = Record[Idx++]; return std::make_pair(LexicalOffset, VisibleOffset); } @@ -2317,6 +2315,23 @@ 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); + } + } + } + return D; } @@ -2458,6 +2473,8 @@ bool PCHReader::ReadDeclsVisibleInContext(DeclContext *DC, } void PCHReader::StartTranslationUnit(ASTConsumer *Consumer) { + this->Consumer = Consumer; + if (!Consumer) return; diff --git a/clang/lib/Frontend/PCHWriter.cpp b/clang/lib/Frontend/PCHWriter.cpp index 15ee2369dd3..b081a2813f9 100644 --- a/clang/lib/Frontend/PCHWriter.cpp +++ b/clang/lib/Frontend/PCHWriter.cpp @@ -574,8 +574,7 @@ void PCHDeclWriter::VisitBlockDecl(BlockDecl *D) { void PCHDeclWriter::VisitDeclContext(DeclContext *DC, uint64_t LexicalOffset, uint64_t VisibleOffset) { Record.push_back(LexicalOffset); - if (DC->getPrimaryContext() == DC) - Record.push_back(VisibleOffset); + Record.push_back(VisibleOffset); } //===----------------------------------------------------------------------===// @@ -1728,20 +1727,6 @@ void PCHWriter::WriteDeclsBlock(ASTContext &Context) { // in the PCH file later. if (isa<FileScopeAsmDecl>(D)) ExternalDefinitions.push_back(ID); - else if (VarDecl *Var = dyn_cast<VarDecl>(D)) { - if (// Non-static file-scope variables with initializers or that - // are tentative definitions. - (Var->isFileVarDecl() && - (Var->getInit() || Var->getStorageClass() == VarDecl::None)) || - // Out-of-line definitions of static data members (C++). - (Var->getDeclContext()->isRecord() && - !Var->getLexicalDeclContext()->isRecord() && - Var->getStorageClass() == VarDecl::Static)) - ExternalDefinitions.push_back(ID); - } else if (FunctionDecl *Func = dyn_cast<FunctionDecl>(D)) { - if (Func->isThisDeclarationADefinition()) - ExternalDefinitions.push_back(ID); - } } // Exit the declarations block |