Job.h revision cfcb96f610d6354234e8c33f3a25e340f6cd3a80
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 13789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar#include "clang/Driver/Util.h" 14789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar#include "llvm/ADT/SmallVector.h" 15789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 16a1ead48a4e9961c7eb22592310c7e9c30cb56794Daniel Dunbar#include "llvm/Support/Casting.h" 17a1ead48a4e9961c7eb22592310c7e9c30cb56794Daniel Dunbarusing llvm::isa; 18a1ead48a4e9961c7eb22592310c7e9c30cb56794Daniel Dunbarusing llvm::cast; 19a1ead48a4e9961c7eb22592310c7e9c30cb56794Daniel Dunbarusing llvm::cast_or_null; 20a1ead48a4e9961c7eb22592310c7e9c30cb56794Daniel Dunbarusing llvm::dyn_cast; 21a1ead48a4e9961c7eb22592310c7e9c30cb56794Daniel Dunbarusing llvm::dyn_cast_or_null; 22a1ead48a4e9961c7eb22592310c7e9c30cb56794Daniel Dunbar 23789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarnamespace clang { 24789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarnamespace driver { 25789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 26789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarclass Job { 27789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarpublic: 28789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar enum JobClass { 29789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar CommandClass, 30789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar PipedJobClass, 31789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar JobListClass 32789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar }; 33789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 34789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarprivate: 35789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar JobClass Kind; 36789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 37789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarprotected: 38789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar Job(JobClass _Kind) : Kind(_Kind) {} 39789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarpublic: 40789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar virtual ~Job(); 41789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 42789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar JobClass getKind() const { return Kind; } 43789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 44789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar static bool classof(const Job *) { return true; } 45789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar}; 46789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 47789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar /// Command - An executable path/name and argument vector to 48789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar /// execute. 49789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarclass Command : public Job { 50d57ac5990d22592665a67a28fc5d39f1155424d3Daniel Dunbar /// The executable to run. 51789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar const char *Executable; 52d57ac5990d22592665a67a28fc5d39f1155424d3Daniel Dunbar 53d57ac5990d22592665a67a28fc5d39f1155424d3Daniel Dunbar /// The list of program arguments (not including the implicit first 54d57ac5990d22592665a67a28fc5d39f1155424d3Daniel Dunbar /// argument, which will be the executable). 55d57ac5990d22592665a67a28fc5d39f1155424d3Daniel Dunbar ArgStringList Arguments; 56789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 57789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarpublic: 58d57ac5990d22592665a67a28fc5d39f1155424d3Daniel Dunbar Command(const char *_Executable, const ArgStringList &_Arguments); 59789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 60789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar const char *getExecutable() const { return Executable; } 61d57ac5990d22592665a67a28fc5d39f1155424d3Daniel Dunbar const ArgStringList &getArguments() const { return Arguments; } 62789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 63789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar static bool classof(const Job *J) { 64789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar return J->getKind() == CommandClass; 65789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar } 66789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar static bool classof(const Command *) { return true; } 67789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar}; 68789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 69789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar /// PipedJob - A list of Commands which should be executed together 70789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar /// with their standard inputs and outputs connected. 71789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarclass PipedJob : public Job { 72789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarpublic: 73789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar typedef llvm::SmallVector<Command*, 4> list_type; 74cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar typedef list_type::size_type size_type; 75cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar typedef list_type::iterator iterator; 76cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar typedef list_type::const_iterator const_iterator; 77789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 78789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarprivate: 79789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar list_type Commands; 80789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 81789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarpublic: 82789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar PipedJob(); 83789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 84789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar void addCommand(Command *C) { Commands.push_back(C); } 85789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 86789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar const list_type &getCommands() const { return Commands; } 87cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar 88cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar size_type size() const { return Commands.size(); } 89cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar iterator begin() { return Commands.begin(); } 90cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar const_iterator begin() const { return Commands.begin(); } 91cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar iterator end() { return Commands.end(); } 92cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar const_iterator end() const { return Commands.end(); } 93789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 94789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar static bool classof(const Job *J) { 95789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar return J->getKind() == PipedJobClass; 96789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar } 97789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar static bool classof(const PipedJob *) { return true; } 98789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar}; 99789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 100789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar /// JobList - A sequence of jobs to perform. 101789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarclass JobList : public Job { 102789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarpublic: 103789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar typedef llvm::SmallVector<Job*, 4> list_type; 104cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar typedef list_type::size_type size_type; 105cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar typedef list_type::iterator iterator; 106cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar typedef list_type::const_iterator const_iterator; 107789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 108789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarprivate: 109789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar list_type Jobs; 110789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 111789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarpublic: 112789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar JobList(); 113789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 114789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar void addJob(Job *J) { Jobs.push_back(J); } 115789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 116789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar const list_type &getJobs() const { return Jobs; } 117789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 118cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar size_type size() const { return Jobs.size(); } 119cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar iterator begin() { return Jobs.begin(); } 120cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar const_iterator begin() const { return Jobs.begin(); } 121cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar iterator end() { return Jobs.end(); } 122cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar const_iterator end() const { return Jobs.end(); } 123cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar 124789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar static bool classof(const Job *J) { 125789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar return J->getKind() == JobListClass; 126789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar } 127789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar static bool classof(const JobList *) { return true; } 128789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar}; 129789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 130789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar} // end namespace driver 131789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar} // end namespace clang 132789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 133789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar#endif 134