13ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar//===--- Compilation.h - Compilation Task Data Structure --------*- 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
10176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#ifndef LLVM_CLANG_DRIVER_COMPILATION_H
11176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#define LLVM_CLANG_DRIVER_COMPILATION_H
123ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar
13586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar#include "clang/Driver/Job.h"
14e530ad407af4a8904377592bfdb236acd320c6c2Daniel Dunbar#include "clang/Driver/Util.h"
15586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar#include "llvm/ADT/DenseMap.h"
162b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier#include "llvm/Support/Path.h"
17586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar
18b1e25a1bc03292dc538d336573e0be1490223171Reid Klecknernamespace llvm {
19b1e25a1bc03292dc538d336573e0be1490223171Reid Klecknernamespace opt {
20b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner  class DerivedArgList;
21b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner  class InputArgList;
22b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner}
23b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner}
24b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner
253ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbarnamespace clang {
261b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbarnamespace driver {
27e530ad407af4a8904377592bfdb236acd320c6c2Daniel Dunbar  class Driver;
289d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier  class JobAction;
29586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar  class JobList;
30586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar  class ToolChain;
313ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar
323ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar/// Compilation - A set of tasks to perform for a single driver
333ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar/// invocation.
343ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbarclass Compilation {
35e530ad407af4a8904377592bfdb236acd320c6c2Daniel Dunbar  /// The driver we were created by.
36df35d7f1916140bfed5ab0bad2d5e2bc62c667e5Daniel Dunbar  const Driver &TheDriver;
37e530ad407af4a8904377592bfdb236acd320c6c2Daniel Dunbar
38586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar  /// The default tool chain.
39df35d7f1916140bfed5ab0bad2d5e2bc62c667e5Daniel Dunbar  const ToolChain &DefaultToolChain;
40586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar
41586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar  /// The original (untranslated) input argument list.
42dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner  llvm::opt::InputArgList *Args;
43586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar
44279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  /// The driver translated arguments. Note that toolchains may perform their
45279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  /// own argument translation.
46dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner  llvm::opt::DerivedArgList *TranslatedArgs;
47279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar
4821549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar  /// The list of actions.
4921549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar  ActionList Actions;
5021549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar
51586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar  /// The root list of jobs.
52586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar  JobList Jobs;
53586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar
54be21cd0f07726045367861d3882d18ef30f6a30cDaniel Dunbar  /// Cache of translated arguments for a particular tool chain and bound
55be21cd0f07726045367861d3882d18ef30f6a30cDaniel Dunbar  /// architecture.
56dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner  llvm::DenseMap<std::pair<const ToolChain *, const char *>,
57dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                 llvm::opt::DerivedArgList *> TCArgs;
58586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar
59df78a9515c108677ed42c2b982c612362f18c277Daniel Dunbar  /// Temporary files which should be removed on exit.
60dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner  llvm::opt::ArgStringList TempFiles;
61df78a9515c108677ed42c2b982c612362f18c277Daniel Dunbar
62df78a9515c108677ed42c2b982c612362f18c277Daniel Dunbar  /// Result files which should be removed on failure.
639d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier  ArgStringMap ResultFiles;
64df78a9515c108677ed42c2b982c612362f18c277Daniel Dunbar
655d4d9807a65291cbe6ab88d4a4f74cb7fff01bdePeter Collingbourne  /// Result files which are generated correctly on failure, and which should
665d4d9807a65291cbe6ab88d4a4f74cb7fff01bdePeter Collingbourne  /// only be removed if we crash.
679d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier  ArgStringMap FailureResultFiles;
685d4d9807a65291cbe6ab88d4a4f74cb7fff01bdePeter Collingbourne
692b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  /// Redirection for stdout, stderr, etc.
7057a3bbfa9a97f174b0c80b0309e32f4329c4ae1bRafael Espindola  const StringRef **Redirects;
712b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier
72c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// Whether we're compiling for diagnostic purposes.
73c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  bool ForDiagnostics;
74c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
753ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbarpublic:
761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Compilation(const Driver &D, const ToolChain &DefaultToolChain,
77dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner              llvm::opt::InputArgList *Args,
78dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner              llvm::opt::DerivedArgList *TranslatedArgs);
793ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar  ~Compilation();
803ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar
81e530ad407af4a8904377592bfdb236acd320c6c2Daniel Dunbar  const Driver &getDriver() const { return TheDriver; }
82e530ad407af4a8904377592bfdb236acd320c6c2Daniel Dunbar
8321549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar  const ToolChain &getDefaultToolChain() const { return DefaultToolChain; }
8421549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar
85dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner  const llvm::opt::InputArgList &getInputArgs() const { return *Args; }
8621549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar
87dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner  const llvm::opt::DerivedArgList &getArgs() const { return *TranslatedArgs; }
88279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar
89dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner  llvm::opt::DerivedArgList &getArgs() { return *TranslatedArgs; }
90e75d9cfbf41a0ee9e456a665776f91fdd9773b36David Blaikie
9121549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar  ActionList &getActions() { return Actions; }
9221549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar  const ActionList &getActions() const { return Actions; }
9321549237f14505cfc2a18a06416372a36229d0ceDaniel Dunbar
94586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar  JobList &getJobs() { return Jobs; }
95c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar  const JobList &getJobs() const { return Jobs; }
96c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar
97176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  void addCommand(std::unique_ptr<Command> C) { Jobs.addJob(std::move(C)); }
982fe238ed293bd4bc27af9beb9fa151fad2146fa8Daniel Dunbar
99dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner  const llvm::opt::ArgStringList &getTempFiles() const { return TempFiles; }
100c88a88f6f7672b6bb831dce9da4acfa0c846975fDaniel Dunbar
1019d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier  const ArgStringMap &getResultFiles() const { return ResultFiles; }
102586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar
1039d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier  const ArgStringMap &getFailureResultFiles() const {
1045d4d9807a65291cbe6ab88d4a4f74cb7fff01bdePeter Collingbourne    return FailureResultFiles;
1055d4d9807a65291cbe6ab88d4a4f74cb7fff01bdePeter Collingbourne  }
1065d4d9807a65291cbe6ab88d4a4f74cb7fff01bdePeter Collingbourne
1074762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop  /// Returns the sysroot path.
1084762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop  StringRef getSysRoot() const;
1094762a2da74875d2ae94e0d77d38ed964816cce36Sebastian Pop
110f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  /// getArgsForToolChain - Return the derived argument list for the
1111824d54df85a462ada812dadda18130f951d40f3Dmitri Gribenko  /// tool chain \p TC (or the default tool chain, if TC is not specified).
1124954018954bbc97363eef02d0c83bea19ce9b329Daniel Dunbar  ///
1134954018954bbc97363eef02d0c83bea19ce9b329Daniel Dunbar  /// \param BoundArch - The bound architecture name, or 0.
114dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner  const llvm::opt::DerivedArgList &getArgsForToolChain(const ToolChain *TC,
115dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner                                                       const char *BoundArch);
116586dc233bb88f2920c9f3638f69cef0ccd55dcedDaniel Dunbar
117df78a9515c108677ed42c2b982c612362f18c277Daniel Dunbar  /// addTempFile - Add a file to remove on exit, and returns its
118df78a9515c108677ed42c2b982c612362f18c277Daniel Dunbar  /// argument.
1191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const char *addTempFile(const char *Name) {
1201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    TempFiles.push_back(Name);
121df78a9515c108677ed42c2b982c612362f18c277Daniel Dunbar    return Name;
122df78a9515c108677ed42c2b982c612362f18c277Daniel Dunbar  }
123df78a9515c108677ed42c2b982c612362f18c277Daniel Dunbar
124df78a9515c108677ed42c2b982c612362f18c277Daniel Dunbar  /// addResultFile - Add a file to remove on failure, and returns its
125df78a9515c108677ed42c2b982c612362f18c277Daniel Dunbar  /// argument.
1269d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier  const char *addResultFile(const char *Name, const JobAction *JA) {
1279d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier    ResultFiles[JA] = Name;
128df78a9515c108677ed42c2b982c612362f18c277Daniel Dunbar    return Name;
129df78a9515c108677ed42c2b982c612362f18c277Daniel Dunbar  }
130df78a9515c108677ed42c2b982c612362f18c277Daniel Dunbar
1315d4d9807a65291cbe6ab88d4a4f74cb7fff01bdePeter Collingbourne  /// addFailureResultFile - Add a file to remove if we crash, and returns its
1325d4d9807a65291cbe6ab88d4a4f74cb7fff01bdePeter Collingbourne  /// argument.
1339d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier  const char *addFailureResultFile(const char *Name, const JobAction *JA) {
1349d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier    FailureResultFiles[JA] = Name;
1355d4d9807a65291cbe6ab88d4a4f74cb7fff01bdePeter Collingbourne    return Name;
1365d4d9807a65291cbe6ab88d4a4f74cb7fff01bdePeter Collingbourne  }
1375d4d9807a65291cbe6ab88d4a4f74cb7fff01bdePeter Collingbourne
1389d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier  /// CleanupFile - Delete a given file.
1399d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier  ///
1409d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier  /// \param IssueErrors - Report failures as errors.
1419d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier  /// \return Whether the file was removed successfully.
1429d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier  bool CleanupFile(const char *File, bool IssueErrors = false) const;
1439d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier
144e530ad407af4a8904377592bfdb236acd320c6c2Daniel Dunbar  /// CleanupFileList - Remove the files in the given list.
145e530ad407af4a8904377592bfdb236acd320c6c2Daniel Dunbar  ///
146e530ad407af4a8904377592bfdb236acd320c6c2Daniel Dunbar  /// \param IssueErrors - Report failures as errors.
147e530ad407af4a8904377592bfdb236acd320c6c2Daniel Dunbar  /// \return Whether all files were removed successfully.
148dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner  bool CleanupFileList(const llvm::opt::ArgStringList &Files,
1499d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier                       bool IssueErrors = false) const;
1509d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier
1519d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier  /// CleanupFileMap - Remove the files in the given map.
1529d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier  ///
1539d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier  /// \param JA - If specified, only delete the files associated with this
1549d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier  /// JobAction.  Otherwise, delete all files in the map.
1559d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier  /// \param IssueErrors - Report failures as errors.
1569d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier  /// \return Whether all files were removed successfully.
1579d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier  bool CleanupFileMap(const ArgStringMap &Files,
1589d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier                      const JobAction *JA,
1599d718635fa805674aaba5d938f3dc6b35b8632baChad Rosier                      bool IssueErrors = false) const;
160e530ad407af4a8904377592bfdb236acd320c6c2Daniel Dunbar
161ceafbc8f55e00345a85d5e6674d3339a45cbbf76Daniel Dunbar  /// ExecuteCommand - Execute an actual command.
162ceafbc8f55e00345a85d5e6674d3339a45cbbf76Daniel Dunbar  ///
16331c11ebdaab0acfa10e231730ae95e32c0e39e1fDaniel Dunbar  /// \param FailingCommand - For non-zero results, this will be set to the
16431c11ebdaab0acfa10e231730ae95e32c0e39e1fDaniel Dunbar  /// Command which failed, if any.
165ceafbc8f55e00345a85d5e6674d3339a45cbbf76Daniel Dunbar  /// \return The result code of the subprocess.
16631c11ebdaab0acfa10e231730ae95e32c0e39e1fDaniel Dunbar  int ExecuteCommand(const Command &C, const Command *&FailingCommand) const;
167ceafbc8f55e00345a85d5e6674d3339a45cbbf76Daniel Dunbar
16849b98e700e300b8a61b2f7fbb0bb22264e8ec27aDaniel Dunbar  /// ExecuteJob - Execute a single job.
16949b98e700e300b8a61b2f7fbb0bb22264e8ec27aDaniel Dunbar  ///
170a16355c31878403443f99077cc8df8318457faf5Chad Rosier  /// \param FailingCommands - For non-zero results, this will be a vector of
171a16355c31878403443f99077cc8df8318457faf5Chad Rosier  /// failing commands and their associated result code.
172a16355c31878403443f99077cc8df8318457faf5Chad Rosier  void ExecuteJob(const Job &J,
173a16355c31878403443f99077cc8df8318457faf5Chad Rosier     SmallVectorImpl< std::pair<int, const Command *> > &FailingCommands) const;
1742b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier
1752b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  /// initCompilationForDiagnostics - Remove stale state and suppress output
1762b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  /// so compilation can be reexecuted to generate additional diagnostic
1772b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  /// information (e.g., preprocessed source(s)).
1782b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  void initCompilationForDiagnostics();
179c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
180c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  /// Return true if we're compiling for diagnostics.
181c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  bool isForDiagnostics() { return ForDiagnostics; }
1823ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar};
1833ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar
1841b3bb6efc59a21f794b534078f9ae7e95393f510Daniel Dunbar} // end namespace driver
1853ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar} // end namespace clang
1863ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar
1873ede8d0a7d1813f678ccc6011a99a0834b1b6116Daniel Dunbar#endif
188