1789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar//===--- Job.h - Commands to Execute ----------------------------*- C++ -*-===// 2789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar// 3789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar// The LLVM Compiler Infrastructure 4789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar// 5789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar// This file is distributed under the University of Illinois Open Source 6789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar// License. See LICENSE.TXT for details. 7789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar// 8789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar//===----------------------------------------------------------------------===// 9789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 10789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar#ifndef CLANG_DRIVER_JOB_H_ 11789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar#define CLANG_DRIVER_JOB_H_ 12789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 1330a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/Basic/LLVM.h" 14789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar#include "llvm/ADT/SmallVector.h" 15b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/Option.h" 16651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include <memory> 17a1ead48a4e9961c7eb22592310c7e9c30cb56794Daniel Dunbar 18fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborgnamespace llvm { 19fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg class raw_ostream; 20fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg} 21fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg 22789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarnamespace clang { 23789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarnamespace driver { 24b1e25a1bc03292dc538d336573e0be1490223171Reid Klecknerclass Action; 25daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbarclass Command; 26daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbarclass Tool; 27789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 2864228b6c0696f3579d40bab0ef40691ef4f41242Hans Wennborg// Re-export this as clang::driver::ArgStringList. 295c6ecf5a07317edc4a01f967a43eb3f76142d387Hans Wennborgusing llvm::opt::ArgStringList; 304832ee31e6ab96b77ad429ef9347fbf09c099f47Hans Wennborg 31789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarclass Job { 32789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarpublic: 33789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar enum JobClass { 34789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar CommandClass, 35c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg FallbackCommandClass, 36789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar JobListClass 37789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar }; 38789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 39789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarprivate: 40789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar JobClass Kind; 41789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 42789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarprotected: 43789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar Job(JobClass _Kind) : Kind(_Kind) {} 44789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarpublic: 45789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar virtual ~Job(); 46789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 47789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar JobClass getKind() const { return Kind; } 48fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg 49fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg /// Print - Print this Job in -### format. 50fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg /// 51fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg /// \param OS - The stream to print on. 52fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg /// \param Terminator - A string to print at the end of the line. 53fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg /// \param Quote - Should separate arguments be quoted. 54fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg /// \param CrashReport - Whether to print for inclusion in a crash report. 55fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg virtual void Print(llvm::raw_ostream &OS, const char *Terminator, 56fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg bool Quote, bool CrashReport = false) const = 0; 57789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar}; 58789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 59c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg/// Command - An executable path/name and argument vector to 60c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg/// execute. 61789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarclass Command : public Job { 62cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar /// Source - The action which caused the creation of this job. 63cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar const Action &Source; 64cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar 65daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar /// Tool - The tool which caused the creation of this job. 66daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar const Tool &Creator; 67daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar 68d57ac5990d22592665a67a28fc5d39f1155424d3Daniel Dunbar /// The executable to run. 69789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar const char *Executable; 70d57ac5990d22592665a67a28fc5d39f1155424d3Daniel Dunbar 71d57ac5990d22592665a67a28fc5d39f1155424d3Daniel Dunbar /// The list of program arguments (not including the implicit first 72d57ac5990d22592665a67a28fc5d39f1155424d3Daniel Dunbar /// argument, which will be the executable). 735c6ecf5a07317edc4a01f967a43eb3f76142d387Hans Wennborg llvm::opt::ArgStringList Arguments; 74789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 75789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarpublic: 76daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Command(const Action &_Source, const Tool &_Creator, const char *_Executable, 775c6ecf5a07317edc4a01f967a43eb3f76142d387Hans Wennborg const llvm::opt::ArgStringList &_Arguments); 78cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar 79651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Print(llvm::raw_ostream &OS, const char *Terminator, bool Quote, 80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool CrashReport = false) const override; 81fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg 82c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg virtual int Execute(const StringRef **Redirects, std::string *ErrMsg, 83c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg bool *ExecutionFailed) const; 84aaaa2a1889fe882e7e41048e3b298ca594454eb1Hans Wennborg 85cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar /// getSource - Return the Action which caused the creation of this job. 86cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar const Action &getSource() const { return Source; } 87789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 88daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar /// getCreator - Return the Tool which caused the creation of this job. 89daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar const Tool &getCreator() const { return Creator; } 90daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar 91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const char *getExecutable() const { return Executable; } 92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 935c6ecf5a07317edc4a01f967a43eb3f76142d387Hans Wennborg const llvm::opt::ArgStringList &getArguments() const { return Arguments; } 94789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Job *J) { 96c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg return J->getKind() == CommandClass || 97c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg J->getKind() == FallbackCommandClass; 98789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar } 99789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar}; 100789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 101c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg/// Like Command, but with a fallback which is executed in case 102c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg/// the primary command crashes. 103c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborgclass FallbackCommand : public Command { 104c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborgpublic: 105c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg FallbackCommand(const Action &Source_, const Tool &Creator_, 106c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg const char *Executable_, const ArgStringList &Arguments_, 107c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg Command *Fallback_); 108c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg 109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Print(llvm::raw_ostream &OS, const char *Terminator, bool Quote, 110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool CrashReport = false) const override; 111c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg 112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int Execute(const StringRef **Redirects, std::string *ErrMsg, 113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool *ExecutionFailed) const override; 114c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg 115c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg static bool classof(const Job *J) { 116c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg return J->getKind() == FallbackCommandClass; 117c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg } 118c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg 119c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborgprivate: 120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::unique_ptr<Command> Fallback; 121c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg}; 122c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg 123c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg/// JobList - A sequence of jobs to perform. 124789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarclass JobList : public Job { 125789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarpublic: 126686775deca8b8685eb90801495880e3abdd844c2Chris Lattner typedef SmallVector<Job*, 4> list_type; 127cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar typedef list_type::size_type size_type; 128cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar typedef list_type::iterator iterator; 129cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar typedef list_type::const_iterator const_iterator; 130789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 131789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarprivate: 132789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar list_type Jobs; 133789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 134789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarpublic: 135789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar JobList(); 1369d44023453094832ada2770941e9e4c96ce0e75eDaniel Dunbar virtual ~JobList(); 137789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 138651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void Print(llvm::raw_ostream &OS, const char *Terminator, 139651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool Quote, bool CrashReport = false) const override; 140fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg 1419d44023453094832ada2770941e9e4c96ce0e75eDaniel Dunbar /// Add a job to the list (taking ownership). 142789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar void addJob(Job *J) { Jobs.push_back(J); } 143789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 1442b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier /// Clear the job list. 1452b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier void clear(); 1462b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier 147789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar const list_type &getJobs() const { return Jobs; } 148789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 149cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar size_type size() const { return Jobs.size(); } 150cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar iterator begin() { return Jobs.begin(); } 151cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar const_iterator begin() const { return Jobs.begin(); } 152cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar iterator end() { return Jobs.end(); } 153cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar const_iterator end() const { return Jobs.end(); } 1541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Job *J) { 1561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return J->getKind() == JobListClass; 157789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar } 158789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar}; 1591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 160789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar} // end namespace driver 161789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar} // end namespace clang 162789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 163789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar#endif 164