From 0e0bae8139e25de81f18b6a519783a06f7ba1e25 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Wed, 11 Nov 2009 21:43:12 +0000 Subject: [PATCH] Add DependencyOutputOptions to wrap -M... options, and propogate to CompilerInvocation and clang-cc. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86880 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Frontend/CompilerInvocation.h | 11 +++++ .../clang/Frontend/DependencyOutputOptions.h | 42 +++++++++++++++++ .../Frontend/PreprocessorOutputOptions.h | 7 +-- include/clang/Frontend/Utils.h | 6 +-- lib/Frontend/DependencyFile.cpp | 44 +++++++++-------- tools/clang-cc/Options.cpp | 36 ++++++++++++++ tools/clang-cc/Options.h | 3 ++ tools/clang-cc/clang-cc.cpp | 47 +++---------------- 8 files changed, 129 insertions(+), 67 deletions(-) create mode 100644 include/clang/Frontend/DependencyOutputOptions.h diff --git a/include/clang/Frontend/CompilerInvocation.h b/include/clang/Frontend/CompilerInvocation.h index b217dca965..fc0b95284d 100644 --- a/include/clang/Frontend/CompilerInvocation.h +++ b/include/clang/Frontend/CompilerInvocation.h @@ -12,6 +12,7 @@ #include "clang/Basic/LangOptions.h" #include "clang/Frontend/CompileOptions.h" +#include "clang/Frontend/DependencyOutputOptions.h" #include "clang/Frontend/DiagnosticOptions.h" #include "clang/Frontend/HeaderSearchOptions.h" #include "clang/Frontend/PreprocessorOptions.h" @@ -31,6 +32,9 @@ class CompilerInvocation { /// Options controlling IRgen and the backend. CompileOptions CompileOpts; + /// Options controlling dependency output. + DependencyOutputOptions DependencyOutputOpts; + /// Options controlling the diagnostic engine. DiagnosticOptions DiagOpts; @@ -68,6 +72,13 @@ public: return CompileOpts; } + DependencyOutputOptions &getDependencyOutputOpts() { + return DependencyOutputOpts; + } + const DependencyOutputOptions &getDependencyOutputOpts() const { + return DependencyOutputOpts; + } + DiagnosticOptions &getDiagnosticOpts() { return DiagOpts; } const DiagnosticOptions &getDiagnosticOpts() const { return DiagOpts; } diff --git a/include/clang/Frontend/DependencyOutputOptions.h b/include/clang/Frontend/DependencyOutputOptions.h new file mode 100644 index 0000000000..194c0ebafe --- /dev/null +++ b/include/clang/Frontend/DependencyOutputOptions.h @@ -0,0 +1,42 @@ +//===--- DependencyOutputOptions.h ------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_FRONTEND_DEPENDENCYOUTPUTOPTIONS_H +#define LLVM_CLANG_FRONTEND_DEPENDENCYOUTPUTOPTIONS_H + +#include + +namespace clang { + +/// DependencyOutputOptions - Options for controlling the compiler dependency +/// file generation. +class DependencyOutputOptions { +public: + unsigned IncludeSystemHeaders : 1; ///< Include system header dependencies. + unsigned UsePhonyTargets : 1; ///< Include phony targets for each + /// dependency, which can avoid some 'make' + /// problems. + + /// The file to write depencency output to. + std::string OutputFile; + + /// A list of names to use as the targets in the dependency file; this list + /// must contain at least one entry. + std::vector Targets; + +public: + DependencyOutputOptions() { + IncludeSystemHeaders = 0; + UsePhonyTargets = 0; + } +}; + +} // end namespace clang + +#endif diff --git a/include/clang/Frontend/PreprocessorOutputOptions.h b/include/clang/Frontend/PreprocessorOutputOptions.h index e375a8545f..a712a3d1bb 100644 --- a/include/clang/Frontend/PreprocessorOutputOptions.h +++ b/include/clang/Frontend/PreprocessorOutputOptions.h @@ -10,9 +10,6 @@ #ifndef LLVM_CLANG_FRONTEND_PREPROCESSOROUTPUTOPTIONS_H #define LLVM_CLANG_FRONTEND_PREPROCESSOROUTPUTOPTIONS_H -#include -#include - namespace clang { /// PreprocessorOutputOptions - Options for controlling the C preprocessor @@ -22,8 +19,8 @@ public: unsigned ShowCPP : 1; ///< Print normal preprocessed output. unsigned ShowMacros : 1; ///< Print macro definitions. unsigned ShowLineMarkers : 1; ///< Show #line markers. - unsigned ShowComments : 1; /// Show comments. - unsigned ShowMacroComments : 1; /// Show comments, even in macros. + unsigned ShowComments : 1; ///< Show comments. + unsigned ShowMacroComments : 1; ///< Show comments, even in macros. public: PreprocessorOutputOptions() { diff --git a/include/clang/Frontend/Utils.h b/include/clang/Frontend/Utils.h index d3a0b097f0..859f06a434 100644 --- a/include/clang/Frontend/Utils.h +++ b/include/clang/Frontend/Utils.h @@ -26,6 +26,7 @@ class raw_fd_ostream; namespace clang { class ASTConsumer; class Decl; +class DependencyOutputOptions; class Diagnostic; class HeaderSearch; class HeaderSearchOptions; @@ -77,9 +78,8 @@ bool CheckDiagnostics(Preprocessor &PP); /// AttachDependencyFileGen - Create a dependency file generator, and attach /// it to the given preprocessor. This takes ownership of the output stream. -void AttachDependencyFileGen(Preprocessor *PP, llvm::raw_ostream *OS, - std::vector &Targets, - bool IncludeSystemHeaders, bool PhonyTarget); +void AttachDependencyFileGen(Preprocessor *PP, + const DependencyOutputOptions &Opts); /// CacheTokens - Cache tokens for use with PCH. Note that this requires /// a seekable stream. diff --git a/lib/Frontend/DependencyFile.cpp b/lib/Frontend/DependencyFile.cpp index 81d1179f28..9c311fac62 100644 --- a/lib/Frontend/DependencyFile.cpp +++ b/lib/Frontend/DependencyFile.cpp @@ -12,12 +12,14 @@ //===----------------------------------------------------------------------===// #include "clang/Frontend/Utils.h" -#include "clang/Basic/SourceManager.h" #include "clang/Basic/FileManager.h" -#include "clang/Lex/Preprocessor.h" -#include "clang/Lex/PPCallbacks.h" -#include "clang/Lex/DirectoryLookup.h" #include "clang/Basic/SourceLocation.h" +#include "clang/Basic/SourceManager.h" +#include "clang/Frontend/DependencyOutputOptions.h" +#include "clang/Frontend/FrontendDiagnostic.h" +#include "clang/Lex/DirectoryLookup.h" +#include "clang/Lex/PPCallbacks.h" +#include "clang/Lex/Preprocessor.h" #include "llvm/ADT/StringSet.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/raw_ostream.h" @@ -42,11 +44,10 @@ private: public: DependencyFileCallback(const Preprocessor *_PP, llvm::raw_ostream *_OS, - const std::vector &_Targets, - bool _IncludeSystemHeaders, - bool _PhonyTarget) - : PP(_PP), Targets(_Targets), OS(_OS), - IncludeSystemHeaders(_IncludeSystemHeaders), PhonyTarget(_PhonyTarget) {} + const DependencyOutputOptions &Opts) + : PP(_PP), Targets(Opts.Targets), OS(_OS), + IncludeSystemHeaders(Opts.IncludeSystemHeaders), + PhonyTarget(Opts.UsePhonyTargets) {} ~DependencyFileCallback() { OutputDependencyFile(); @@ -59,18 +60,23 @@ public: }; } +void clang::AttachDependencyFileGen(Preprocessor *PP, + const DependencyOutputOptions &Opts) { + if (Opts.Targets.empty()) { + PP->getDiagnostics().Report(diag::err_fe_dependency_file_requires_MT); + return; + } + std::string Err; + llvm::raw_ostream *OS(new llvm::raw_fd_ostream(Opts.OutputFile.c_str(), Err)); + if (!Err.empty()) { + PP->getDiagnostics().Report(diag::err_fe_error_opening) + << Opts.OutputFile << Err; + return; + } -void clang::AttachDependencyFileGen(Preprocessor *PP, llvm::raw_ostream *OS, - std::vector &Targets, - bool IncludeSystemHeaders, - bool PhonyTarget) { - assert(!Targets.empty() && "Target required for dependency generation"); - - DependencyFileCallback *PPDep = - new DependencyFileCallback(PP, OS, Targets, IncludeSystemHeaders, - PhonyTarget); - PP->setPPCallbacks(PPDep); + assert(!PP->getPPCallbacks() && "Preprocessor callbacks already registered!"); + PP->setPPCallbacks(new DependencyFileCallback(PP, OS, Opts)); } /// FileMatchesDepCriteria - Determine whether the given Filename should be diff --git a/tools/clang-cc/Options.cpp b/tools/clang-cc/Options.cpp index 211f1412a1..2428d3ab8f 100644 --- a/tools/clang-cc/Options.cpp +++ b/tools/clang-cc/Options.cpp @@ -16,6 +16,7 @@ #include "clang/Basic/TargetInfo.h" #include "clang/Frontend/AnalysisConsumer.h" #include "clang/Frontend/CompileOptions.h" +#include "clang/Frontend/DependencyOutputOptions.h" #include "clang/Frontend/DiagnosticOptions.h" #include "clang/Frontend/HeaderSearchOptions.h" #include "clang/Frontend/PCHReader.h" @@ -189,6 +190,31 @@ TargetFeatures("target-feature", llvm::cl::desc("Target specific attributes")); } +//===----------------------------------------------------------------------===// +// Dependency Output Options +//===----------------------------------------------------------------------===// + +namespace dependencyoutputoptions { + +static llvm::cl::opt +DependencyFile("dependency-file", + llvm::cl::desc("Filename (or -) to write dependency output to")); + +static llvm::cl::opt +DependenciesIncludeSystemHeaders("sys-header-deps", + llvm::cl::desc("Include system headers in dependency output")); + +static llvm::cl::list +DependencyTargets("MT", + llvm::cl::desc("Specify target for dependency")); + +static llvm::cl::opt +PhonyDependencyTarget("MP", + llvm::cl::desc("Create phony target for each dependency " + "(other than main file)")); + +} + //===----------------------------------------------------------------------===// // Diagnostic Options //===----------------------------------------------------------------------===// @@ -616,6 +642,16 @@ void clang::InitializeCompileOptions(CompileOptions &Opts, #endif } +void clang::InitializeDependencyOutputOptions(DependencyOutputOptions &Opts) { + using namespace dependencyoutputoptions; + + Opts.OutputFile = DependencyFile; + Opts.Targets.insert(Opts.Targets.begin(), DependencyTargets.begin(), + DependencyTargets.end()); + Opts.IncludeSystemHeaders = DependenciesIncludeSystemHeaders; + Opts.UsePhonyTargets = PhonyDependencyTarget; +} + void clang::InitializeDiagnosticOptions(DiagnosticOptions &Opts) { using namespace diagnosticoptions; diff --git a/tools/clang-cc/Options.h b/tools/clang-cc/Options.h index 88acb4263a..6275e77e97 100644 --- a/tools/clang-cc/Options.h +++ b/tools/clang-cc/Options.h @@ -16,6 +16,7 @@ namespace clang { class AnalyzerOptions; class CompileOptions; +class DependencyOutputOptions; class DiagnosticOptions; class HeaderSearchOptions; class LangOptions; @@ -40,6 +41,8 @@ enum LangKind { void InitializeAnalyzerOptions(AnalyzerOptions &Opts); +void InitializeDependencyOutputOptions(DependencyOutputOptions &Opts); + void InitializeDiagnosticOptions(DiagnosticOptions &Opts); void InitializeCompileOptions(CompileOptions &Opts, diff --git a/tools/clang-cc/clang-cc.cpp b/tools/clang-cc/clang-cc.cpp index e55deb51c9..85a11923e1 100644 --- a/tools/clang-cc/clang-cc.cpp +++ b/tools/clang-cc/clang-cc.cpp @@ -32,6 +32,7 @@ #include "clang/Frontend/ChainedDiagnosticClient.h" #include "clang/Frontend/CommandLineSourceLoc.h" #include "clang/Frontend/CompilerInvocation.h" +#include "clang/Frontend/DependencyOutputOptions.h" #include "clang/Frontend/FixItRewriter.h" #include "clang/Frontend/FrontendDiagnostic.h" #include "clang/Frontend/PCHReader.h" @@ -454,27 +455,6 @@ static llvm::cl::opt OptPedantic("pedantic"); static llvm::cl::opt OptPedanticErrors("pedantic-errors"); static llvm::cl::opt OptNoWarnings("w"); -//===----------------------------------------------------------------------===// -// Dependency file options -//===----------------------------------------------------------------------===// - -static llvm::cl::opt -DependencyFile("dependency-file", - llvm::cl::desc("Filename (or -) to write dependency output to")); - -static llvm::cl::opt -DependenciesIncludeSystemHeaders("sys-header-deps", - llvm::cl::desc("Include system headers in dependency output")); - -static llvm::cl::list -DependencyTargets("MT", - llvm::cl::desc("Specify target for dependency")); - -static llvm::cl::opt -PhonyDependencyTarget("MP", - llvm::cl::desc("Create phony target for each dependency " - "(other than main file)")); - //===----------------------------------------------------------------------===// // -dump-build-information Stuff //===----------------------------------------------------------------------===// @@ -646,8 +626,7 @@ static ASTConsumer *CreateConsumerAction(const CompilerInvocation &CompOpts, /// static void ProcessInputFile(const CompilerInvocation &CompOpts, Preprocessor &PP, const std::string &InFile, - ProgActions PA, - llvm::LLVMContext& Context) { + ProgActions PA, llvm::LLVMContext& Context) { llvm::OwningPtr OS; llvm::OwningPtr Consumer; bool ClearSourceMgr = false; @@ -1085,6 +1064,9 @@ static void ConstructCompilerInvocation(CompilerInvocation &Opts, InitializeLangOptions(Opts.getLangOpts(), LK, Target, Opts.getCompileOpts()); + // Initialize the dependency output options (-M...). + InitializeDependencyOutputOptions(Opts.getDependencyOutputOpts()); + // Initialize the header search options. InitializeHeaderSearchOptions(Opts.getHeaderSearchOpts(), GetBuiltinIncludePath(Argv0), @@ -1229,23 +1211,8 @@ int main(int argc, char **argv) { HeaderInfo)); // Handle generating dependencies, if requested. - if (!DependencyFile.empty()) { - if (DependencyTargets.empty()) { - Diags.Report(diag::err_fe_dependency_file_requires_MT); - continue; - } - std::string ErrStr; - llvm::raw_ostream *DependencyOS = - new llvm::raw_fd_ostream(DependencyFile.c_str(), ErrStr); - if (!ErrStr.empty()) { - Diags.Report(diag::err_fe_error_opening) << DependencyFile << ErrStr; - continue; - } - - AttachDependencyFileGen(PP.get(), DependencyOS, DependencyTargets, - DependenciesIncludeSystemHeaders, - PhonyDependencyTarget); - } + if (!CompOpts.getDependencyOutputOpts().OutputFile.empty()) + AttachDependencyFileGen(PP.get(), CompOpts.getDependencyOutputOpts()); if (CompOpts.getPreprocessorOpts().getImplicitPCHInclude().empty()) { if (InitializeSourceManager(*PP.get(), InFile)) -- 2.40.0