Driver.h revision 4ad4b3ebbe5769143389dccfcfadb666a4ba5940
13ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//===--- Driver.h - Clang GCC Compatible Driver -----------------*- C++ -*-===//
23ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//
33ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//                     The LLVM Compiler Infrastructure
43ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//
53ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// This file is distributed under the University of Illinois Open Source
63ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar// License. See LICENSE.TXT for details.
73ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//
83ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//===----------------------------------------------------------------------===//
93ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar
103ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#ifndef CLANG_DRIVER_DRIVER_H_
113ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#define CLANG_DRIVER_DRIVER_H_
123ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar
134ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar#include "clang/Basic/Diagnostic.h"
144ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar
15365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar#include <list>
16365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar#include <set>
17365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar#include <string>
18365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar
1953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbarnamespace llvm {
2053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  template<typename T, unsigned N> class SmallVector;
2153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  class raw_ostream;
2253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar}
2353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
243ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbarnamespace clang {
251b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbarnamespace driver {
2653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  class Action;
270648262df75d97b464c2be0ed867da3615659785Daniel Dunbar  class ArgList;
283ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar  class Compilation;
29365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  class HostInfo;
301b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar  class OptTable;
313ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar
323ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar/// Driver - Encapsulate logic for constructing compilation processes
333ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar/// from a set of gcc-driver-like command line arguments.
343ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbarclass Driver {
351b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar  OptTable *Opts;
361b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar
374ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar  Diagnostic &Diags;
384ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar
390648262df75d97b464c2be0ed867da3615659785Daniel Dunbar  /// ParseArgStrings - Parse the given list of strings into an
400648262df75d97b464c2be0ed867da3615659785Daniel Dunbar  /// ArgList.
410648262df75d97b464c2be0ed867da3615659785Daniel Dunbar  ArgList *ParseArgStrings(const char **ArgBegin, const char **ArgEnd);
420648262df75d97b464c2be0ed867da3615659785Daniel Dunbar
434ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar  // Diag - Forwarding function for diagnostics.
444ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar  DiagnosticBuilder Diag(unsigned DiagID) {
454ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar    return Diags.Report(FullSourceLoc(), DiagID);
464ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar  }
474ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar
48365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  // FIXME: Privatize once interface is stable.
49365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbarpublic:
50365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  /// The name the driver was invoked as.
51365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  std::string Name;
52365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar
53365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  /// The path the driver executable was in, as invoked from the
54365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  /// command line.
55365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  std::string Dir;
56dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar
57dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar  /// Default host triple.
58dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar  std::string DefaultHostTriple;
59365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar
60365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  /// Host information for the platform the driver is running as. This
61365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  /// will generally be the actual host platform, but not always.
62365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  HostInfo *Host;
63365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar
64365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  /// Information about the host which can be overriden by the user.
65365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  std::string HostBits, HostMachine, HostSystem, HostRelease;
66365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar
67365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  /// Whether the driver should follow g++ like behavior.
68365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  bool CCCIsCXX : 1;
69365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar
70365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  /// Echo commands while executing (in -v style).
71365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  bool CCCEcho : 1;
72365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar
73365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  /// Don't use clang for any tasks.
74365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  bool CCCNoClang : 1;
75365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar
76365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  /// Don't use clang for handling C++ and Objective-C++ inputs.
77365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  bool CCCNoClangCXX : 1;
78365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar
79365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  /// Don't use clang as a preprocessor (clang's preprocessor will
80365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  /// still be used where an integrated CPP would).
81365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  bool CCCNoClangCPP : 1;
82365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar
83365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  /// Only use clang for the given architectures. Only used when
84365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  /// non-empty.
85365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  std::set<std::string> CCCClangArchs;
86365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar
87365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  /// Certain options suppress the 'no input files' warning.
88365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  bool SuppressMissingInputWarning : 1;
89365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar
90365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  std::list<std::string> TempFiles;
91365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar  std::list<std::string> ResultFiles;
92365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar
933ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbarpublic:
94dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar  Driver(const char *_Name, const char *_Dir,
954ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar         const char *_DefaultHostTriple,
964ad4b3ebbe5769143389dccfcfadb666a4ba5940Daniel Dunbar         Diagnostic &_Diags);
973ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar  ~Driver();
983ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar
991b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar  const OptTable &getOpts() const { return *Opts; }
1001b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar
1013ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar  /// BuildCompilation - Construct a compilation object for a command
1023ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar  /// line argument vector.
1033ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar  Compilation *BuildCompilation(int argc, const char **argv);
104365c02f65be026f90e67a8e00e7b827cee60e228Daniel Dunbar
10553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  /// PrintOptions - Print the list of arguments.
10653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  void PrintOptions(const ArgList &Args);
10753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
10853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  /// PrintActions - Print the list of actions.
10953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  void PrintActions(const llvm::SmallVector<Action*, 2> &Actions);
110dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar
111dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar  /// GetHostInfo - Construct a new host info object for the given
112dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar  /// host triple.
113dd98e2cad165ca73c769e4f105a4e47c2216387aDaniel Dunbar  static HostInfo *GetHostInfo(const char *HostTriple);
11453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
11553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  /// BuildUniversalActions - Construct the list of actions to perform
11653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  /// for the given arguments, which may require a universal build.
11753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  ///
11853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  /// \param Args - The input arguments.
11953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  /// \param Actions - The list to store the resulting actions onto.
12053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  void BuildUniversalActions(const ArgList &Args,
12153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar                             llvm::SmallVector<Action*, 2> &Actions);
12253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
12353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  /// BuildActions - Construct the list of actions to perform for the
12453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  /// given arguments, which are only done for a single architecture.
12553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  ///
12653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  /// \param Args - The input arguments.
12753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  /// \param Actions - The list to store the resulting actions onto.
12853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar  void BuildActions(const ArgList &Args,
12953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar                    llvm::SmallVector<Action*, 2> &Actions);
1303ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar};
1313ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar
1321b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar} // end namespace driver
1333ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar} // end namespace clang
1343ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar
1353ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#endif
136