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