Job.h revision d57ac5990d22592665a67a28fc5d39f1155424d3
1fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen//===--- Job.h - Commands to Execute ----------------------------*- C++ -*-===// 2fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen// 3fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen// The LLVM Compiler Infrastructure 4fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen// 5fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen// This file is distributed under the University of Illinois Open Source 6fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen// License. See LICENSE.TXT for details. 7fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen// 8fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen//===----------------------------------------------------------------------===// 9fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen 10fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen#ifndef CLANG_DRIVER_JOB_H_ 11fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen#define CLANG_DRIVER_JOB_H_ 12fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen 13fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen#include "clang/Driver/Util.h" 14fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen#include "llvm/ADT/SmallVector.h" 15fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen 16fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen#include "llvm/Support/Casting.h" 17fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenenusing llvm::isa; 18fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenenusing llvm::cast; 191230ac820ea94b8f3f6285fd4cae056e62d96183Jason Monkusing llvm::cast_or_null; 2049b6103b56d777cb41f280e0dc636f738f6ba56dJason Monkusing llvm::dyn_cast; 21fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenenusing llvm::dyn_cast_or_null; 22fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen 23fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenennamespace clang { 2449b6103b56d777cb41f280e0dc636f738f6ba56dJason Monknamespace driver { 25fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen 26fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenenclass Job { 27fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenenpublic: 28fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen enum JobClass { 29fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen CommandClass, 30fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen PipedJobClass, 31fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen JobListClass 32fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen }; 33fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen 34fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenenprivate: 35fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen JobClass Kind; 36fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen 37fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenenprotected: 38fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen Job(JobClass _Kind) : Kind(_Kind) {} 39fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenenpublic: 40fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen virtual ~Job(); 41fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen 42fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen JobClass getKind() const { return Kind; } 43b637ba08ad9fb106011392fa1688e51028007ec2Martijn Coenen 44fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen static bool classof(const Job *) { return true; } 45fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen}; 4649b6103b56d777cb41f280e0dc636f738f6ba56dJason Monk 4749b6103b56d777cb41f280e0dc636f738f6ba56dJason Monk /// Command - An executable path/name and argument vector to 4849b6103b56d777cb41f280e0dc636f738f6ba56dJason Monk /// execute. 4949b6103b56d777cb41f280e0dc636f738f6ba56dJason Monkclass Command : public Job { 5049b6103b56d777cb41f280e0dc636f738f6ba56dJason Monk /// The executable to run. 51fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen const char *Executable; 5249b6103b56d777cb41f280e0dc636f738f6ba56dJason Monk 53fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen /// The list of program arguments (not including the implicit first 5449b6103b56d777cb41f280e0dc636f738f6ba56dJason Monk /// argument, which will be the executable). 55fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen ArgStringList Arguments; 56fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen 57fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenenpublic: 58fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen Command(const char *_Executable, const ArgStringList &_Arguments); 5949b6103b56d777cb41f280e0dc636f738f6ba56dJason Monk 6049b6103b56d777cb41f280e0dc636f738f6ba56dJason Monk const char *getExecutable() const { return Executable; } 61fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen const ArgStringList &getArguments() const { return Arguments; } 62fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen 63fe58b534f6a1bf63dadb18dae13c59ed8a014eecMartijn Coenen static bool classof(const Job *J) { 64 return J->getKind() == CommandClass; 65 } 66 static bool classof(const Command *) { return true; } 67}; 68 69 /// PipedJob - A list of Commands which should be executed together 70 /// with their standard inputs and outputs connected. 71class PipedJob : public Job { 72public: 73 typedef llvm::SmallVector<Command*, 4> list_type; 74 75private: 76 list_type Commands; 77 78public: 79 PipedJob(); 80 81 void addCommand(Command *C) { Commands.push_back(C); } 82 83 const list_type &getCommands() const { return Commands; } 84 85 static bool classof(const Job *J) { 86 return J->getKind() == PipedJobClass; 87 } 88 static bool classof(const PipedJob *) { return true; } 89}; 90 91 /// JobList - A sequence of jobs to perform. 92class JobList : public Job { 93public: 94 typedef llvm::SmallVector<Job*, 4> list_type; 95 96private: 97 list_type Jobs; 98 99public: 100 JobList(); 101 102 void addJob(Job *J) { Jobs.push_back(J); } 103 104 const list_type &getJobs() const { return Jobs; } 105 106 static bool classof(const Job *J) { 107 return J->getKind() == JobListClass; 108 } 109 static bool classof(const JobList *) { return true; } 110}; 111 112} // end namespace driver 113} // end namespace clang 114 115#endif 116