From 41e90bcb77a266f15d891127f4bd67a78c56b76a Mon Sep 17 00:00:00 2001 From: Ilya Biryukov Date: Fri, 15 Dec 2017 11:27:51 +0000 Subject: [PATCH] [clang] Add PPCallbacks list to preprocessor when building a preacompiled preamble. Summary: Revision D38639 needs this commit in order to properly make open definition calls on include statements work. Patch by William Enright. Reviewers: malaperle, krasimir, bkramer, ilya-biryukov Reviewed By: malaperle, ilya-biryukov Subscribers: cfe-commits, arphaman, ilya-biryukov Differential Revision: https://reviews.llvm.org/D39375 llvm-svn: 320804 --- .../clang/Frontend/PrecompiledPreamble.h | 8 +++--- clang/lib/Frontend/ASTUnit.cpp | 5 ++-- clang/lib/Frontend/PrecompiledPreamble.cpp | 25 ++++++------------- 3 files changed, 13 insertions(+), 25 deletions(-) diff --git a/clang/include/clang/Frontend/PrecompiledPreamble.h b/clang/include/clang/Frontend/PrecompiledPreamble.h index 13edea09af86..64342b1dffa8 100644 --- a/clang/include/clang/Frontend/PrecompiledPreamble.h +++ b/clang/include/clang/Frontend/PrecompiledPreamble.h @@ -255,11 +255,9 @@ public: /// NOTE: To allow more flexibility a custom ASTConsumer could probably be /// used instead, but having only this method allows a simpler API. virtual void HandleTopLevelDecl(DeclGroupRef DG); - /// Called for each macro defined in the Preamble. - /// NOTE: To allow more flexibility a custom PPCallbacks could probably be - /// used instead, but having only this method allows a simpler API. - virtual void HandleMacroDefined(const Token &MacroNameTok, - const MacroDirective *MD); + /// Creates wrapper class for PPCallbacks so we can also process information + /// about includes that are inside of a preamble + virtual std::unique_ptr createPPCallbacks(); }; enum class BuildPreambleError { diff --git a/clang/lib/Frontend/ASTUnit.cpp b/clang/lib/Frontend/ASTUnit.cpp index f7da9b90475c..1160df15a920 100644 --- a/clang/lib/Frontend/ASTUnit.cpp +++ b/clang/lib/Frontend/ASTUnit.cpp @@ -970,9 +970,8 @@ public: } } - void HandleMacroDefined(const Token &MacroNameTok, - const MacroDirective *MD) override { - AddDefinedMacroToHash(MacroNameTok, Hash); + std::unique_ptr createPPCallbacks() override { + return llvm::make_unique(Hash); } private: diff --git a/clang/lib/Frontend/PrecompiledPreamble.cpp b/clang/lib/Frontend/PrecompiledPreamble.cpp index c6ee4d0289d2..f6964d02b237 100644 --- a/clang/lib/Frontend/PrecompiledPreamble.cpp +++ b/clang/lib/Frontend/PrecompiledPreamble.cpp @@ -115,19 +115,6 @@ void TemporaryFiles::removeFile(StringRef File) { llvm::sys::fs::remove(File); } -class PreambleMacroCallbacks : public PPCallbacks { -public: - PreambleMacroCallbacks(PreambleCallbacks &Callbacks) : Callbacks(Callbacks) {} - - void MacroDefined(const Token &MacroNameTok, - const MacroDirective *MD) override { - Callbacks.HandleMacroDefined(MacroNameTok, MD); - } - -private: - PreambleCallbacks &Callbacks; -}; - class PrecompilePreambleAction : public ASTFrontendAction { public: PrecompilePreambleAction(std::string *InMemStorage, @@ -213,8 +200,6 @@ PrecompilePreambleAction::CreateASTConsumer(CompilerInstance &CI, if (!CI.getFrontendOpts().RelocatablePCH) Sysroot.clear(); - CI.getPreprocessor().addPPCallbacks( - llvm::make_unique(Callbacks)); return llvm::make_unique( *this, CI.getPreprocessor(), Sysroot, std::move(OS)); } @@ -351,6 +336,11 @@ llvm::ErrorOr PrecompiledPreamble::Build( if (!Act->BeginSourceFile(*Clang.get(), Clang->getFrontendOpts().Inputs[0])) return BuildPreambleError::BeginSourceFileFailed; + std::unique_ptr DelegatedPPCallbacks = + Callbacks.createPPCallbacks(); + if (DelegatedPPCallbacks) + Clang->getPreprocessor().addPPCallbacks(std::move(DelegatedPPCallbacks)); + Act->Execute(); // Run the callbacks. @@ -707,8 +697,9 @@ void PrecompiledPreamble::setupPreambleStorage( void PreambleCallbacks::AfterExecute(CompilerInstance &CI) {} void PreambleCallbacks::AfterPCHEmitted(ASTWriter &Writer) {} void PreambleCallbacks::HandleTopLevelDecl(DeclGroupRef DG) {} -void PreambleCallbacks::HandleMacroDefined(const Token &MacroNameTok, - const MacroDirective *MD) {} +std::unique_ptr PreambleCallbacks::createPPCallbacks() { + return nullptr; +} std::error_code clang::make_error_code(BuildPreambleError Error) { return std::error_code(static_cast(Error), BuildPreambleErrorCategory());