diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-10-14 20:14:18 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-10-14 20:14:18 +0000 |
commit | b972858068d2ea77f72a1e7b1812b196afd6be2e (patch) | |
tree | 4b6921de4a1dd56b91a85058ac4327c7831f0c35 /lib/Frontend/FrontendAction.cpp | |
parent | f34553d823e4434e84851b5dc06c6a98346ab2f6 (diff) |
Introduce command line option -dump-deserialized-decls which is used to print the PCH decls that got deserialized, for testing purposes.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@116503 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/FrontendAction.cpp')
-rw-r--r-- | lib/Frontend/FrontendAction.cpp | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/lib/Frontend/FrontendAction.cpp b/lib/Frontend/FrontendAction.cpp index b244c5ce02..429b009333 100644 --- a/lib/Frontend/FrontendAction.cpp +++ b/lib/Frontend/FrontendAction.cpp @@ -16,12 +16,43 @@ #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/FrontendDiagnostic.h" #include "clang/Parse/ParseAST.h" +#include "clang/Serialization/ASTDeserializationListener.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/Timer.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" using namespace clang; +namespace { + +/// \brief Dumps deserialized declarations. +class DeserializedDeclsDumper : public ASTDeserializationListener { + ASTDeserializationListener *Previous; + +public: + DeserializedDeclsDumper(ASTDeserializationListener *Previous) + : Previous(Previous) { } + + virtual void DeclRead(serialization::DeclID ID, const Decl *D) { + llvm::outs() << "PCH DECL: " << D->getDeclKindName(); + if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) + llvm::outs() << " - " << ND->getNameAsString(); + llvm::outs() << "\n"; + + if (Previous) + Previous->DeclRead(ID, D); + } + + virtual void SetReader(ASTReader *Reader) {} + virtual void IdentifierRead(serialization::IdentID ID, IdentifierInfo *II) {} + virtual void TypeRead(serialization::TypeIdx Idx, QualType T) {} + virtual void SelectorRead(serialization::SelectorID iD, Selector Sel) {} + virtual void MacroDefinitionRead(serialization::MacroID, + MacroDefinition *MD) {} +}; + +} // end anonymous namespace + FrontendAction::FrontendAction() : Instance(0) {} FrontendAction::~FrontendAction() {} @@ -118,11 +149,15 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI, /// Use PCH? if (!CI.getPreprocessorOpts().ImplicitPCHInclude.empty()) { assert(hasPCHSupport() && "This action does not have PCH support!"); + ASTDeserializationListener *DeserialListener + = CI.getInvocation().getFrontendOpts().ChainedPCH ? + Consumer->GetASTDeserializationListener() : 0; + if (CI.getPreprocessorOpts().DumpDeserializedPCHDecls) + DeserialListener = new DeserializedDeclsDumper(DeserialListener); CI.createPCHExternalASTSource( CI.getPreprocessorOpts().ImplicitPCHInclude, CI.getPreprocessorOpts().DisablePCHValidation, - CI.getInvocation().getFrontendOpts().ChainedPCH? - Consumer->GetASTDeserializationListener() : 0); + DeserialListener); if (!CI.getASTContext().getExternalSource()) goto failure; } |