1 //===--- Job.h - Commands to Execute ----------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef CLANG_DRIVER_JOB_H_ 11 #define CLANG_DRIVER_JOB_H_ 12 13 #include "clang/Driver/Util.h" 14 #include "llvm/ADT/SmallVector.h" 15 #include "clang/Basic/LLVM.h" 16 17 namespace clang { 18 namespace driver { 19 class Command; 20 class Tool; 21 22 class Job { 23 public: 24 enum JobClass { 25 CommandClass, 26 JobListClass 27 }; 28 29 private: 30 JobClass Kind; 31 32 protected: Job(JobClass _Kind)33 Job(JobClass _Kind) : Kind(_Kind) {} 34 public: 35 virtual ~Job(); 36 getKind()37 JobClass getKind() const { return Kind; } 38 39 /// addCommand - Append a command to the current job, which must be 40 /// either a piped job or a job list. 41 void addCommand(Command *C); 42 classof(const Job *)43 static bool classof(const Job *) { return true; } 44 }; 45 46 /// Command - An executable path/name and argument vector to 47 /// execute. 48 class Command : public Job { 49 /// Source - The action which caused the creation of this job. 50 const Action &Source; 51 52 /// Tool - The tool which caused the creation of this job. 53 const Tool &Creator; 54 55 /// The executable to run. 56 const char *Executable; 57 58 /// The list of program arguments (not including the implicit first 59 /// argument, which will be the executable). 60 ArgStringList Arguments; 61 62 public: 63 Command(const Action &_Source, const Tool &_Creator, const char *_Executable, 64 const ArgStringList &_Arguments); 65 66 /// getSource - Return the Action which caused the creation of this job. getSource()67 const Action &getSource() const { return Source; } 68 69 /// getCreator - Return the Tool which caused the creation of this job. getCreator()70 const Tool &getCreator() const { return Creator; } 71 getExecutable()72 const char *getExecutable() const { return Executable; } 73 getArguments()74 const ArgStringList &getArguments() const { return Arguments; } 75 classof(const Job * J)76 static bool classof(const Job *J) { 77 return J->getKind() == CommandClass; 78 } classof(const Command *)79 static bool classof(const Command *) { return true; } 80 }; 81 82 /// JobList - A sequence of jobs to perform. 83 class JobList : public Job { 84 public: 85 typedef llvm::SmallVector<Job*, 4> list_type; 86 typedef list_type::size_type size_type; 87 typedef list_type::iterator iterator; 88 typedef list_type::const_iterator const_iterator; 89 90 private: 91 list_type Jobs; 92 93 public: 94 JobList(); 95 virtual ~JobList(); 96 97 /// Add a job to the list (taking ownership). addJob(Job * J)98 void addJob(Job *J) { Jobs.push_back(J); } 99 getJobs()100 const list_type &getJobs() const { return Jobs; } 101 size()102 size_type size() const { return Jobs.size(); } begin()103 iterator begin() { return Jobs.begin(); } begin()104 const_iterator begin() const { return Jobs.begin(); } end()105 iterator end() { return Jobs.end(); } end()106 const_iterator end() const { return Jobs.end(); } 107 classof(const Job * J)108 static bool classof(const Job *J) { 109 return J->getKind() == JobListClass; 110 } classof(const JobList *)111 static bool classof(const JobList *) { return true; } 112 }; 113 114 } // end namespace driver 115 } // end namespace clang 116 117 #endif 118