From b972858068d2ea77f72a1e7b1812b196afd6be2e Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis <akyrtzi@gmail.com> Date: Thu, 14 Oct 2010 20:14:18 +0000 Subject: [PATCH] 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 --- include/clang/Driver/CC1Options.td | 2 + include/clang/Frontend/PreprocessorOptions.h | 6 ++- lib/Frontend/CompilerInvocation.cpp | 1 + lib/Frontend/FrontendAction.cpp | 39 +++++++++++++++++++- 4 files changed, 45 insertions(+), 3 deletions(-) diff --git a/include/clang/Driver/CC1Options.td b/include/clang/Driver/CC1Options.td index f08b8015427..79dc441075b 100644 --- a/include/clang/Driver/CC1Options.td +++ b/include/clang/Driver/CC1Options.td @@ -473,6 +473,8 @@ def fno_rtti : Flag<"-fno-rtti">, HelpText<"Disable generation of rtti information">; def fno_validate_pch : Flag<"-fno-validate-pch">, HelpText<"Disable validation of precompiled headers">; +def dump_deserialized_pch_decls : Flag<"-dump-deserialized-decls">, + HelpText<"Dump declarations that are deserialized from PCH, for testing">; def fshort_wchar : Flag<"-fshort-wchar">, HelpText<"Force wchar_t to be a short unsigned int">; def fshort_enums : Flag<"-fshort-enums">, diff --git a/include/clang/Frontend/PreprocessorOptions.h b/include/clang/Frontend/PreprocessorOptions.h index 851c1f0108a..34b49e1fac1 100644 --- a/include/clang/Frontend/PreprocessorOptions.h +++ b/include/clang/Frontend/PreprocessorOptions.h @@ -46,7 +46,10 @@ public: /// \brief When true, disables most of the normal validation performed on /// precompiled headers. bool DisablePCHValidation; - + + /// \brief Dump declarations that are deserialized from PCH, for testing. + bool DumpDeserializedPCHDecls; + /// \brief If non-zero, the implicit PCH include is actually a precompiled /// preamble that covers this number of bytes in the main source file. /// @@ -118,6 +121,7 @@ public: public: PreprocessorOptions() : UsePredefines(true), DetailedRecord(false), DisablePCHValidation(false), + DumpDeserializedPCHDecls(false), PrecompiledPreambleBytes(0, true), RetainRemappedFileBuffers(false) { } diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index e3ba54cd390..8f0cb089ee6 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -1409,6 +1409,7 @@ static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args, Opts.UsePredefines = !Args.hasArg(OPT_undef); Opts.DetailedRecord = Args.hasArg(OPT_detailed_preprocessing_record); Opts.DisablePCHValidation = Args.hasArg(OPT_fno_validate_pch); + Opts.DumpDeserializedPCHDecls = Args.hasArg(OPT_dump_deserialized_pch_decls); if (const Arg *A = Args.getLastArg(OPT_preamble_bytes_EQ)) { llvm::StringRef Value(A->getValue(Args)); diff --git a/lib/Frontend/FrontendAction.cpp b/lib/Frontend/FrontendAction.cpp index b244c5ce022..429b0093332 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; } -- GitLab