From d2536a604f59a3cca491f175bf1e49eeca49163b Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Tue, 15 Nov 2011 22:58:25 +0000 Subject: [PATCH] Revert r144703. It was a dumb idea anyway; will add the new bits more incrementally with a new frontend action. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144723 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Frontend/FrontendActions.h | 28 +++---------- lib/Frontend/CompilerInstance.cpp | 11 +++-- lib/Frontend/FrontendActions.cpp | 40 +------------------ .../ExecuteCompilerInvocation.cpp | 4 +- 4 files changed, 13 insertions(+), 70 deletions(-) diff --git a/include/clang/Frontend/FrontendActions.h b/include/clang/Frontend/FrontendActions.h index ba1dbb8f23..72a3d90847 100644 --- a/include/clang/Frontend/FrontendActions.h +++ b/include/clang/Frontend/FrontendActions.h @@ -67,40 +67,22 @@ protected: }; class GeneratePCHAction : public ASTFrontendAction { + bool MakeModule; + protected: virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, StringRef InFile); virtual TranslationUnitKind getTranslationUnitKind() { - return TU_Prefix; + return MakeModule? TU_Module : TU_Prefix; } virtual bool hasASTFileSupport() const { return false; } public: - /// \brief Compute the AST consumer arguments that will be used to - /// create the PCHGenerator instance returned by CreateASTConsumer. - /// - /// \returns true if an error occurred, false otherwise. - static bool ComputeASTConsumerArguments(CompilerInstance &CI, - StringRef InFile, - std::string &Sysroot, - std::string &OutputFile, - raw_ostream *&OS); -}; - -class GenerateModuleAction : public ASTFrontendAction { -protected: - virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, - StringRef InFile); - - virtual TranslationUnitKind getTranslationUnitKind() { - return TU_Module; - } + /// \brief Create a new action + explicit GeneratePCHAction(bool MakeModule) : MakeModule(MakeModule) { } - virtual bool hasASTFileSupport() const { return false; } - -public: /// \brief Compute the AST consumer arguments that will be used to /// create the PCHGenerator instance returned by CreateASTConsumer. /// diff --git a/lib/Frontend/CompilerInstance.cpp b/lib/Frontend/CompilerInstance.cpp index 0a32cb96f7..ea2c3bd6c6 100644 --- a/lib/Frontend/CompilerInstance.cpp +++ b/lib/Frontend/CompilerInstance.cpp @@ -647,14 +647,13 @@ bool CompilerInstance::ExecuteAction(FrontendAction &Act) { llvm::EnableStatistics(); for (unsigned i = 0, e = getFrontendOpts().Inputs.size(); i != e; ++i) { - InputKind InKind = getFrontendOpts().Inputs[i].first; - std::string InFile = getFrontendOpts().Inputs[i].second; - + const std::string &InFile = getFrontendOpts().Inputs[i].second; + // Reset the ID tables if we are reusing the SourceManager. if (hasSourceManager()) getSourceManager().clearIDTables(); - if (Act.BeginSourceFile(*this, InFile, InKind)) { + if (Act.BeginSourceFile(*this, InFile, getFrontendOpts().Inputs[i].first)) { Act.Execute(); Act.EndSourceFile(); } @@ -699,7 +698,7 @@ static InputKind getSourceInputKindFromOptions(const LangOptions &LangOpts) { namespace { struct CompileModuleData { CompilerInstance &Instance; - GenerateModuleAction &CreateModuleAction; + GeneratePCHAction &CreateModuleAction; }; } @@ -1024,7 +1023,7 @@ static void compileModule(CompilerInstance &ImportingInstance, /*ShouldCloneClient=*/true); // Construct a module-generating action. - GenerateModuleAction CreateModuleAction; + GeneratePCHAction CreateModuleAction(true); // Execute the action to actually build the module in-place. Use a separate // thread so that we get a stack large enough. diff --git a/lib/Frontend/FrontendActions.cpp b/lib/Frontend/FrontendActions.cpp index 2fcbc67ef1..6f84da9630 100644 --- a/lib/Frontend/FrontendActions.cpp +++ b/lib/Frontend/FrontendActions.cpp @@ -85,7 +85,7 @@ ASTConsumer *GeneratePCHAction::CreateASTConsumer(CompilerInstance &CI, if (!CI.getFrontendOpts().RelocatablePCH) Sysroot.clear(); - return new PCHGenerator(CI.getPreprocessor(), OutputFile, /*Module=*/false, + return new PCHGenerator(CI.getPreprocessor(), OutputFile, MakeModule, Sysroot, OS); } @@ -113,44 +113,6 @@ bool GeneratePCHAction::ComputeASTConsumerArguments(CompilerInstance &CI, return false; } -ASTConsumer *GenerateModuleAction::CreateASTConsumer(CompilerInstance &CI, - StringRef InFile) { - std::string Sysroot; - std::string OutputFile; - raw_ostream *OS = 0; - if (ComputeASTConsumerArguments(CI, InFile, Sysroot, OutputFile, OS)) - return 0; - - if (!CI.getFrontendOpts().RelocatablePCH) - Sysroot.clear(); - return new PCHGenerator(CI.getPreprocessor(), OutputFile, /*Module=*/true, - Sysroot, OS); -} - -bool GenerateModuleAction::ComputeASTConsumerArguments(CompilerInstance &CI, - StringRef InFile, - std::string &Sysroot, - std::string &OutputFile, - raw_ostream *&OS) { - Sysroot = CI.getHeaderSearchOpts().Sysroot; - if (CI.getFrontendOpts().RelocatablePCH && Sysroot.empty()) { - CI.getDiagnostics().Report(diag::err_relocatable_without_isysroot); - return true; - } - - // We use createOutputFile here because this is exposed via libclang, and we - // must disable the RemoveFileOnSignal behavior. - // We use a temporary to avoid race conditions. - OS = CI.createOutputFile(CI.getFrontendOpts().OutputFile, /*Binary=*/true, - /*RemoveFileOnSignal=*/false, InFile, - /*Extension=*/"", /*useTemporary=*/true); - if (!OS) - return true; - - OutputFile = CI.getFrontendOpts().OutputFile; - return false; -} - ASTConsumer *SyntaxOnlyAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) { return new ASTConsumer(); diff --git a/lib/FrontendTool/ExecuteCompilerInvocation.cpp b/lib/FrontendTool/ExecuteCompilerInvocation.cpp index ea50a76a39..c9af3cc3ff 100644 --- a/lib/FrontendTool/ExecuteCompilerInvocation.cpp +++ b/lib/FrontendTool/ExecuteCompilerInvocation.cpp @@ -49,8 +49,8 @@ static FrontendAction *CreateFrontendBaseAction(CompilerInstance &CI) { case EmitCodeGenOnly: return new EmitCodeGenOnlyAction(); case EmitObj: return new EmitObjAction(); case FixIt: return new FixItAction(); - case GenerateModule: return new GenerateModuleAction(); - case GeneratePCH: return new GeneratePCHAction(); + case GenerateModule: return new GeneratePCHAction(true); + case GeneratePCH: return new GeneratePCHAction(false); case GeneratePTH: return new GeneratePTHAction(); case InitOnly: return new InitOnlyAction(); case ParseSyntaxOnly: return new SyntaxOnlyAction(); -- 2.40.0