Driver.h revision 1fd6c4b8abbbdcbae0e221f35100102112dabff2
12861e737e84e4884109b9526ac645194ba892a74Michal Krol//===--- Driver.h - Clang GCC Compatible Driver -----------------*- C++ -*-===//
22861e737e84e4884109b9526ac645194ba892a74Michal Krol//
3942ee025908a95afc57990c57d6754ca1a626b04Brian//                     The LLVM Compiler Infrastructure
42861e737e84e4884109b9526ac645194ba892a74Michal Krol//
5942ee025908a95afc57990c57d6754ca1a626b04Brian// This file is distributed under the University of Illinois Open Source
62861e737e84e4884109b9526ac645194ba892a74Michal Krol// License. See LICENSE.TXT for details.
72861e737e84e4884109b9526ac645194ba892a74Michal Krol//
82861e737e84e4884109b9526ac645194ba892a74Michal Krol//===----------------------------------------------------------------------===//
92861e737e84e4884109b9526ac645194ba892a74Michal Krol
102861e737e84e4884109b9526ac645194ba892a74Michal Krol#ifndef CLANG_DRIVER_DRIVER_H_
112861e737e84e4884109b9526ac645194ba892a74Michal Krol#define CLANG_DRIVER_DRIVER_H_
122861e737e84e4884109b9526ac645194ba892a74Michal Krol
132861e737e84e4884109b9526ac645194ba892a74Michal Krol#include "clang/Basic/Diagnostic.h"
142861e737e84e4884109b9526ac645194ba892a74Michal Krol
152861e737e84e4884109b9526ac645194ba892a74Michal Krol#include "clang/Driver/Phases.h"
162861e737e84e4884109b9526ac645194ba892a74Michal Krol#include "clang/Driver/Util.h"
172861e737e84e4884109b9526ac645194ba892a74Michal Krol
182861e737e84e4884109b9526ac645194ba892a74Michal Krol#include "llvm/System/Path.h" // FIXME: Kill when CompilationInfo
192861e737e84e4884109b9526ac645194ba892a74Michal Krol                              // lands.
202861e737e84e4884109b9526ac645194ba892a74Michal Krol#include <list>
212861e737e84e4884109b9526ac645194ba892a74Michal Krol#include <set>
222861e737e84e4884109b9526ac645194ba892a74Michal Krol#include <string>
232861e737e84e4884109b9526ac645194ba892a74Michal Krol
242861e737e84e4884109b9526ac645194ba892a74Michal Krolnamespace clang {
252861e737e84e4884109b9526ac645194ba892a74Michal Krolnamespace driver {
262861e737e84e4884109b9526ac645194ba892a74Michal Krol  class Action;
272861e737e84e4884109b9526ac645194ba892a74Michal Krol  class ArgList;
282861e737e84e4884109b9526ac645194ba892a74Michal Krol  class Compilation;
292861e737e84e4884109b9526ac645194ba892a74Michal Krol  class HostInfo;
302861e737e84e4884109b9526ac645194ba892a74Michal Krol  class InputInfo;
312861e737e84e4884109b9526ac645194ba892a74Michal Krol  class JobAction;
32101d1a658a614d1e2ec02b1e697f6161291af653José Fonseca  class OptTable;
33101d1a658a614d1e2ec02b1e697f6161291af653José Fonseca  class PipedJob;
34101d1a658a614d1e2ec02b1e697f6161291af653José Fonseca  class ToolChain;
3521750a2d9d2a4ed69308316b121fd53b0c873aeaVinson Lee
360560d81ce94d27f2162d77d981468cea1b2bbd8aBrian/// Driver - Encapsulate logic for constructing compilation processes
37b26aae67f5fe4194b48a5d3ddf704797b804b58cBrian/// from a set of gcc-driver-like command line arguments.
380560d81ce94d27f2162d77d981468cea1b2bbd8aBrianclass Driver {
390560d81ce94d27f2162d77d981468cea1b2bbd8aBrian  OptTable *Opts;
402861e737e84e4884109b9526ac645194ba892a74Michal Krol
412861e737e84e4884109b9526ac645194ba892a74Michal Krol  Diagnostic &Diags;
42942ee025908a95afc57990c57d6754ca1a626b04Brian
43942ee025908a95afc57990c57d6754ca1a626b04Brian  // Diag - Forwarding function for diagnostics.
44765f1a12c6256282fe175ec92a0d01b45e4322c7Brian Paul  DiagnosticBuilder Diag(unsigned DiagID) const {
45765f1a12c6256282fe175ec92a0d01b45e4322c7Brian Paul    return Diags.Report(FullSourceLoc(), DiagID);
46122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul  }
47765f1a12c6256282fe175ec92a0d01b45e4322c7Brian Paul
48765f1a12c6256282fe175ec92a0d01b45e4322c7Brian Paul  // FIXME: Privatize once interface is stable.
492861e737e84e4884109b9526ac645194ba892a74Michal Krolpublic:
5021841f0ae5ca9b55ee23ecaa3513e91b6752aa16Brian Paul  /// The name the driver was invoked as.
512861e737e84e4884109b9526ac645194ba892a74Michal Krol  std::string Name;
522861e737e84e4884109b9526ac645194ba892a74Michal Krol
53f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg  /// The path the driver executable was in, as invoked from the
542861e737e84e4884109b9526ac645194ba892a74Michal Krol  /// command line.
552861e737e84e4884109b9526ac645194ba892a74Michal Krol  std::string Dir;
562861e737e84e4884109b9526ac645194ba892a74Michal Krol
575b2f8dc01300058d43d8043aa897722f39657e93Brian Paul  /// Default host triple.
585b2f8dc01300058d43d8043aa897722f39657e93Brian Paul  std::string DefaultHostTriple;
594567b479531d2791ad2d6a598c9dd9e3730b0504Brian Paul
605b2f8dc01300058d43d8043aa897722f39657e93Brian Paul  /// Default name for linked images (e.g., "a.out").
615b2f8dc01300058d43d8043aa897722f39657e93Brian Paul  std::string DefaultImageName;
625b2f8dc01300058d43d8043aa897722f39657e93Brian Paul
635b2f8dc01300058d43d8043aa897722f39657e93Brian Paul  /// Host information for the platform the driver is running as. This
645b2f8dc01300058d43d8043aa897722f39657e93Brian Paul  /// will generally be the actual host platform, but not always.
655b2f8dc01300058d43d8043aa897722f39657e93Brian Paul  const HostInfo *Host;
664567b479531d2791ad2d6a598c9dd9e3730b0504Brian Paul
674567b479531d2791ad2d6a598c9dd9e3730b0504Brian Paul  /// The default tool chain for this host.
684567b479531d2791ad2d6a598c9dd9e3730b0504Brian Paul  // FIXME: This shouldn't be here; this should be in a
694567b479531d2791ad2d6a598c9dd9e3730b0504Brian Paul  // CompilationInfo structure.
704567b479531d2791ad2d6a598c9dd9e3730b0504Brian Paul  ToolChain *DefaultToolChain;
714567b479531d2791ad2d6a598c9dd9e3730b0504Brian Paul
724567b479531d2791ad2d6a598c9dd9e3730b0504Brian Paul  /// Information about the host which can be overriden by the user.
734567b479531d2791ad2d6a598c9dd9e3730b0504Brian Paul  std::string HostBits, HostMachine, HostSystem, HostRelease;
748ad821df0a2d49964141f2ea4ef8179f4edc052fBrian Paul
758ad821df0a2d49964141f2ea4ef8179f4edc052fBrian Paul  /// Whether the driver should follow g++ like behavior.
768ad821df0a2d49964141f2ea4ef8179f4edc052fBrian Paul  bool CCCIsCXX : 1;
77dd528f0ec18cfbd6f0a5b23b8cb46a97b96ab965Brian Paul
78874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul  /// Echo commands while executing (in -v style).
79dd528f0ec18cfbd6f0a5b23b8cb46a97b96ab965Brian Paul  bool CCCEcho : 1;
80dd528f0ec18cfbd6f0a5b23b8cb46a97b96ab965Brian Paul
811ab1b15e9d0da1c5215a20770735b5477f5313dfChia-I Wu  /// Don't use clang for any tasks.
82dd528f0ec18cfbd6f0a5b23b8cb46a97b96ab965Brian Paul  bool CCCNoClang : 1;
832861e737e84e4884109b9526ac645194ba892a74Michal Krol
842861e737e84e4884109b9526ac645194ba892a74Michal Krol  /// Don't use clang for handling C++ and Objective-C++ inputs.
852861e737e84e4884109b9526ac645194ba892a74Michal Krol  bool CCCNoClangCXX : 1;
862861e737e84e4884109b9526ac645194ba892a74Michal Krol
872861e737e84e4884109b9526ac645194ba892a74Michal Krol  /// Don't use clang as a preprocessor (clang's preprocessor will
88af3d9dba562813ffed71691bffd7faf6665c4487Brian Paul  /// still be used where an integrated CPP would).
89f67b020a942911f80b7b774c6d64701d1981c608Kristian Høgsberg  bool CCCNoClangCPP : 1;
90f67b020a942911f80b7b774c6d64701d1981c608Kristian Høgsberg
91af3d9dba562813ffed71691bffd7faf6665c4487Brian Paul  /// Only use clang for the given architectures. Only used when
922861e737e84e4884109b9526ac645194ba892a74Michal Krol  /// non-empty.
93af3d9dba562813ffed71691bffd7faf6665c4487Brian Paul  std::set<std::string> CCCClangArchs;
942861e737e84e4884109b9526ac645194ba892a74Michal Krol
95df43fb661b2030d9b833a42dd47b8d7bf58d73aaBrian  /// Certain options suppress the 'no input files' warning.
96df43fb661b2030d9b833a42dd47b8d7bf58d73aaBrian  bool SuppressMissingInputWarning : 1;
972861e737e84e4884109b9526ac645194ba892a74Michal Krol
982861e737e84e4884109b9526ac645194ba892a74Michal Krol  std::list<std::string> TempFiles;
992861e737e84e4884109b9526ac645194ba892a74Michal Krol  std::list<std::string> ResultFiles;
1002861e737e84e4884109b9526ac645194ba892a74Michal Krol
1012861e737e84e4884109b9526ac645194ba892a74Michal Krolpublic:
102b26aae67f5fe4194b48a5d3ddf704797b804b58cBrian  Driver(const char *_Name, const char *_Dir,
1032861e737e84e4884109b9526ac645194ba892a74Michal Krol         const char *_DefaultHostTriple,
1042861e737e84e4884109b9526ac645194ba892a74Michal Krol         const char *_DefaultImageName,
1052861e737e84e4884109b9526ac645194ba892a74Michal Krol         Diagnostic &_Diags);
1062861e737e84e4884109b9526ac645194ba892a74Michal Krol  ~Driver();
107df43fb661b2030d9b833a42dd47b8d7bf58d73aaBrian
108df43fb661b2030d9b833a42dd47b8d7bf58d73aaBrian  /// @name Accessors
1092861e737e84e4884109b9526ac645194ba892a74Michal Krol  /// @{
110b26aae67f5fe4194b48a5d3ddf704797b804b58cBrian
1112861e737e84e4884109b9526ac645194ba892a74Michal Krol  const OptTable &getOpts() const { return *Opts; }
1127f752fed993e5e9423abac200dd59141edbada56Dave Airlie
113da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin  /// @}
114da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin  /// @name Primary Functionality
115da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin  /// @{
116da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
117da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin  /// BuildCompilation - Construct a compilation object for a command
118da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin  /// line argument vector.
119da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin  ///
120b26aae67f5fe4194b48a5d3ddf704797b804b58cBrian  /// \return A compilation, or 0 if none was built for the given
12163d683091fe3a9600b65ae7ef3b554168b805406Brian Paul  /// argument vector. A null return value does not necessarily
1227f752fed993e5e9423abac200dd59141edbada56Dave Airlie  /// indicate an error condition, the diagnostics should be queried
1237f752fed993e5e9423abac200dd59141edbada56Dave Airlie  /// to determine if an error occurred.
124b7eea9a1ce9f3a28b74d77db19dcd859b6638a41Brian Paul  Compilation *BuildCompilation(int argc, const char **argv);
1257f752fed993e5e9423abac200dd59141edbada56Dave Airlie
12663d683091fe3a9600b65ae7ef3b554168b805406Brian Paul  /// @name Driver Steps
1277f752fed993e5e9423abac200dd59141edbada56Dave Airlie  /// @{
1282861e737e84e4884109b9526ac645194ba892a74Michal Krol
1292861e737e84e4884109b9526ac645194ba892a74Michal Krol  /// ParseArgStrings - Parse the given list of strings into an
1302861e737e84e4884109b9526ac645194ba892a74Michal Krol  /// ArgList.
1312861e737e84e4884109b9526ac645194ba892a74Michal Krol  ArgList *ParseArgStrings(const char **ArgBegin, const char **ArgEnd);
13221841f0ae5ca9b55ee23ecaa3513e91b6752aa16Brian Paul
13321841f0ae5ca9b55ee23ecaa3513e91b6752aa16Brian Paul  /// BuildActions - Construct the list of actions to perform for the
13421841f0ae5ca9b55ee23ecaa3513e91b6752aa16Brian Paul  /// given arguments, which are only done for a single architecture.
135f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg  ///
13621841f0ae5ca9b55ee23ecaa3513e91b6752aa16Brian Paul  /// \param Args - The input arguments.
13793da673904d4c520d3fbd2210e53777bf1598ac6Roland Scheidegger  /// \param Actions - The list to store the resulting actions onto.
138df43fb661b2030d9b833a42dd47b8d7bf58d73aaBrian  void BuildActions(ArgList &Args, ActionList &Actions) const;
1391631a9513d32ddcc5467225ad25d0e7a154af895Brian
14021841f0ae5ca9b55ee23ecaa3513e91b6752aa16Brian Paul  /// BuildUniversalActions - Construct the list of actions to perform
14193da673904d4c520d3fbd2210e53777bf1598ac6Roland Scheidegger  /// for the given arguments, which may require a universal build.
142df43fb661b2030d9b833a42dd47b8d7bf58d73aaBrian  ///
1437ec2b0d0d6b6a0f760e55ffdee0bdb385a3e900aEric Anholt  /// \param Args - The input arguments.
14421841f0ae5ca9b55ee23ecaa3513e91b6752aa16Brian Paul  /// \param Actions - The list to store the resulting actions onto.
145da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin  void BuildUniversalActions(ArgList &Args, ActionList &Actions) const;
146da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
147da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin  /// BuildJobs - Bind actions to concrete tools and translate
148da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin  /// arguments to form the list of jobs to run.
14963d683091fe3a9600b65ae7ef3b554168b805406Brian Paul  ///
1507f752fed993e5e9423abac200dd59141edbada56Dave Airlie  /// \arg C - The compilation that is being built.
1517f752fed993e5e9423abac200dd59141edbada56Dave Airlie  void BuildJobs(Compilation &C, const ActionList &Actions) const;
15263d683091fe3a9600b65ae7ef3b554168b805406Brian Paul
15363d683091fe3a9600b65ae7ef3b554168b805406Brian Paul  /// @}
15432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg  /// @name Helper Methods
15563d683091fe3a9600b65ae7ef3b554168b805406Brian Paul  /// @{
1567f752fed993e5e9423abac200dd59141edbada56Dave Airlie
1577f752fed993e5e9423abac200dd59141edbada56Dave Airlie  /// PrintOptions - Print the list of arguments.
15832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg  void PrintOptions(const ArgList &Args) const;
15921841f0ae5ca9b55ee23ecaa3513e91b6752aa16Brian Paul
16021841f0ae5ca9b55ee23ecaa3513e91b6752aa16Brian Paul  /// PrintVersion - Print the driver version.
16121841f0ae5ca9b55ee23ecaa3513e91b6752aa16Brian Paul  void PrintVersion() const;
1624b654d41da08b3b5475144c027e97a3ae7ab5696Brian
1634b654d41da08b3b5475144c027e97a3ae7ab5696Brian  /// PrintActions - Print the list of actions.
164d8d086c20b5a43353c4980cf234d8329900585f5Nicolai Haehnle  void PrintActions(const ArgList &Args, const ActionList &Actions) const;
1654b654d41da08b3b5475144c027e97a3ae7ab5696Brian
1664b654d41da08b3b5475144c027e97a3ae7ab5696Brian  /// GetFilePath - Lookup \arg Name in the list of file search paths.
1674b654d41da08b3b5475144c027e97a3ae7ab5696Brian  ///
168f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg  /// \arg TC - Use the provided tool chain for additional information
1694b654d41da08b3b5475144c027e97a3ae7ab5696Brian  /// on directories to search, or the DefaultToolChain if not
1704b654d41da08b3b5475144c027e97a3ae7ab5696Brian  /// provided.
17157e222d6e5ef5744491d093475e1136aedf81810Brian Paul  // FIXME: This should be in CompilationInfo.
17257e222d6e5ef5744491d093475e1136aedf81810Brian Paul  llvm::sys::Path GetFilePath(const char *Name, const ToolChain *TC=0) const;
1734b654d41da08b3b5475144c027e97a3ae7ab5696Brian
1744b654d41da08b3b5475144c027e97a3ae7ab5696Brian  /// GetProgramPath - Lookup \arg Name in the list of program search
1754b654d41da08b3b5475144c027e97a3ae7ab5696Brian  /// paths.
1764b654d41da08b3b5475144c027e97a3ae7ab5696Brian  ///
17757e222d6e5ef5744491d093475e1136aedf81810Brian Paul  /// \arg TC - Use the provided tool chain for additional information
17857e222d6e5ef5744491d093475e1136aedf81810Brian Paul  /// on directories to search, or the DefaultToolChain if not
1794b654d41da08b3b5475144c027e97a3ae7ab5696Brian  /// provided.
1804b654d41da08b3b5475144c027e97a3ae7ab5696Brian  // FIXME: This should be in CompilationInfo.
1814b654d41da08b3b5475144c027e97a3ae7ab5696Brian  llvm::sys::Path GetProgramPath(const char *Name, const ToolChain *TC=0) const;
182da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
183da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin  /// HandleImmediateArgs - Handle any arguments which should be
184e4f8d33aea7e0112dfbf3a38fdc36d11b2e7be10Brian Paul  /// treated before building actions or binding tools.
185da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin  ///
186da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin  /// \return Whether any compilation should be built for this
1874b654d41da08b3b5475144c027e97a3ae7ab5696Brian  /// invocation.
1884b654d41da08b3b5475144c027e97a3ae7ab5696Brian  bool HandleImmediateArgs(const ArgList &Args);
1894b654d41da08b3b5475144c027e97a3ae7ab5696Brian
1904b654d41da08b3b5475144c027e97a3ae7ab5696Brian  /// ConstructAction - Construct the appropriate action to do for
1914b654d41da08b3b5475144c027e97a3ae7ab5696Brian  /// \arg Phase on the \arg Input, taking in to account arguments
19232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg  /// like -fsyntax-only or --analyze.
1934b654d41da08b3b5475144c027e97a3ae7ab5696Brian  Action *ConstructPhaseAction(const ArgList &Args, phases::ID Phase,
1944b654d41da08b3b5475144c027e97a3ae7ab5696Brian                               Action *Input) const;
1954b654d41da08b3b5475144c027e97a3ae7ab5696Brian
1964b654d41da08b3b5475144c027e97a3ae7ab5696Brian
1974b654d41da08b3b5475144c027e97a3ae7ab5696Brian  /// BuildJobsForAction - Construct the jobs to perform for the
1984b654d41da08b3b5475144c027e97a3ae7ab5696Brian  /// action \arg A.
1994b654d41da08b3b5475144c027e97a3ae7ab5696Brian  void BuildJobsForAction(Compilation &C,
20021841f0ae5ca9b55ee23ecaa3513e91b6752aa16Brian Paul                          const Action *A,
20121841f0ae5ca9b55ee23ecaa3513e91b6752aa16Brian Paul                          const ToolChain *TC,
20221841f0ae5ca9b55ee23ecaa3513e91b6752aa16Brian Paul                          bool CanAcceptPipe,
2032861e737e84e4884109b9526ac645194ba892a74Michal Krol                          bool AtTopLevel,
2042861e737e84e4884109b9526ac645194ba892a74Michal Krol                          const char *LinkingOutput,
2052861e737e84e4884109b9526ac645194ba892a74Michal Krol                          InputInfo &Result) const;
2062861e737e84e4884109b9526ac645194ba892a74Michal Krol
207f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg  /// GetNamedOutputPath - Return the name to use for the output of
2082861e737e84e4884109b9526ac645194ba892a74Michal Krol  /// the action \arg JA. The result is appended to the compilation's
2092861e737e84e4884109b9526ac645194ba892a74Michal Krol  /// list of temporary or result files, as appropriate.
21032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg  ///
2112861e737e84e4884109b9526ac645194ba892a74Michal Krol  /// \param C - The compilation.
2122861e737e84e4884109b9526ac645194ba892a74Michal Krol  /// \param JA - The action of interest.
2132861e737e84e4884109b9526ac645194ba892a74Michal Krol  /// \param BaseInput - The original input file that this action was
2142861e737e84e4884109b9526ac645194ba892a74Michal Krol  /// triggered by.
2152861e737e84e4884109b9526ac645194ba892a74Michal Krol  /// \param AtTopLevel - Whether this is a "top-level" action.
2162861e737e84e4884109b9526ac645194ba892a74Michal Krol  const char *GetNamedOutputPath(Compilation &C,
2172861e737e84e4884109b9526ac645194ba892a74Michal Krol                                 const JobAction &JA,
2182861e737e84e4884109b9526ac645194ba892a74Michal Krol                                 const char *BaseInput,
2192861e737e84e4884109b9526ac645194ba892a74Michal Krol                                 bool AtTopLevel) const;
22032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg
2212861e737e84e4884109b9526ac645194ba892a74Michal Krol  /// GetHostInfo - Construct a new host info object for the given
2222861e737e84e4884109b9526ac645194ba892a74Michal Krol  /// host triple.
2232861e737e84e4884109b9526ac645194ba892a74Michal Krol  static const HostInfo *GetHostInfo(const char *HostTriple);
2242861e737e84e4884109b9526ac645194ba892a74Michal Krol
2252861e737e84e4884109b9526ac645194ba892a74Michal Krol  /// @}
2262861e737e84e4884109b9526ac645194ba892a74Michal Krol};
2272861e737e84e4884109b9526ac645194ba892a74Michal Krol
2282861e737e84e4884109b9526ac645194ba892a74Michal Krol} // end namespace driver
2292861e737e84e4884109b9526ac645194ba892a74Michal Krol} // end namespace clang
2302861e737e84e4884109b9526ac645194ba892a74Michal Krol
2312861e737e84e4884109b9526ac645194ba892a74Michal Krol#endif
2322861e737e84e4884109b9526ac645194ba892a74Michal Krol