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