diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-04-22 19:09:20 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-04-22 19:09:20 +0000 |
commit | 0af2ca4b6ddc788658069a0994941268ce250fc7 (patch) | |
tree | 11483ed96a1a322713a05d9c308ccb50829d5a31 /lib/Frontend/PCHReader.cpp | |
parent | 25bcbaf55691f15db3e2bbf7b4c53056a04c6a54 (diff) |
Minimize the number and kind of "external definitions" that the PCH
file needs to store. CodeGen needs to see these definitions (via
HandleTopLevelDecl), otherwise it won't be able to generate code for
them.
This patch notifies the consumer (e.g., CodeGen) about function
definitions and variable definitions when the corresponding
declarations are deserialized. Hence, we don't eagerly deserialize the
declarations for every variable or function that has a definition in
the PCH file. This gives another 5% speedup for the Carbon-prefixed
"Hello, World!", and brings our PCH statistics down to something far
more reasonable:
*** PCH Statistics:
13/20693 types read (0.062823%)
17/59230 declarations read (0.028702%)
54/44914 identifiers read (0.120230%)
0/32954 statements read (0.000000%)
5/6187 macros read (0.080815%)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69820 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/PCHReader.cpp')
-rw-r--r-- | lib/Frontend/PCHReader.cpp | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index 976b98dd11..c6c34e9749 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/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; |