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" 159594675cc1eb52a054de13c4a21e466643847480Chris Lattner#include "clang/Basic/LLVM.h" 16a1ead48a4e9961c7eb22592310c7e9c30cb56794Daniel Dunbar 17789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarnamespace clang { 18789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarnamespace driver { 19daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbarclass Command; 20daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbarclass Tool; 21789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 22789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarclass Job { 23789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarpublic: 24789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar enum JobClass { 25789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar CommandClass, 26789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar JobListClass 27789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar }; 28789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 29789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarprivate: 30789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar JobClass Kind; 31789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 32789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarprotected: 33789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar Job(JobClass _Kind) : Kind(_Kind) {} 34789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarpublic: 35789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar virtual ~Job(); 36789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 37789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar JobClass getKind() const { return Kind; } 38789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 39871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar /// addCommand - Append a command to the current job, which must be 40871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar /// either a piped job or a job list. 41871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar void addCommand(Command *C); 42871adcf4e41285e3f4c3b62eaa1b2e05b60b92daDaniel Dunbar 431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Job *) { return true; } 44789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar}; 45789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 46789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar /// Command - An executable path/name and argument vector to 47789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar /// execute. 48789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarclass Command : public Job { 4999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 5099ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie 51cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar /// Source - The action which caused the creation of this job. 52cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar const Action &Source; 53cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar 54daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar /// Tool - The tool which caused the creation of this job. 55daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar const Tool &Creator; 56daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar 57d57ac5990d22592665a67a28fc5d39f1155424d3Daniel Dunbar /// The executable to run. 58789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar const char *Executable; 59d57ac5990d22592665a67a28fc5d39f1155424d3Daniel Dunbar 60d57ac5990d22592665a67a28fc5d39f1155424d3Daniel Dunbar /// The list of program arguments (not including the implicit first 61d57ac5990d22592665a67a28fc5d39f1155424d3Daniel Dunbar /// argument, which will be the executable). 62d57ac5990d22592665a67a28fc5d39f1155424d3Daniel Dunbar ArgStringList Arguments; 63789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 64789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarpublic: 65daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar Command(const Action &_Source, const Tool &_Creator, const char *_Executable, 66cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar const ArgStringList &_Arguments); 67cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar 68cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar /// getSource - Return the Action which caused the creation of this job. 69cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar const Action &getSource() const { return Source; } 70789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 71daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar /// getCreator - Return the Tool which caused the creation of this job. 72daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar const Tool &getCreator() const { return Creator; } 73daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar 74789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar const char *getExecutable() const { return Executable; } 75cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar 76d57ac5990d22592665a67a28fc5d39f1155424d3Daniel Dunbar const ArgStringList &getArguments() const { return Arguments; } 77789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Job *J) { 791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return J->getKind() == CommandClass; 80789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar } 81789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar static bool classof(const Command *) { return true; } 82789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar}; 83789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 84789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar /// JobList - A sequence of jobs to perform. 85789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarclass JobList : public Job { 86789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarpublic: 87686775deca8b8685eb90801495880e3abdd844c2Chris Lattner typedef SmallVector<Job*, 4> list_type; 88cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar typedef list_type::size_type size_type; 89cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar typedef list_type::iterator iterator; 90cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar typedef list_type::const_iterator const_iterator; 91789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 92789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarprivate: 93789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar list_type Jobs; 94789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 95789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarpublic: 96789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar JobList(); 979d44023453094832ada2770941e9e4c96ce0e75eDaniel Dunbar virtual ~JobList(); 98789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 999d44023453094832ada2770941e9e4c96ce0e75eDaniel Dunbar /// Add a job to the list (taking ownership). 100789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar void addJob(Job *J) { Jobs.push_back(J); } 101789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 1022b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier /// Clear the job list. 1032b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier void clear(); 1042b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier 105789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar const list_type &getJobs() const { return Jobs; } 106789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 107cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar size_type size() const { return Jobs.size(); } 108cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar iterator begin() { return Jobs.begin(); } 109cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar const_iterator begin() const { return Jobs.begin(); } 110cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar iterator end() { return Jobs.end(); } 111cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar const_iterator end() const { return Jobs.end(); } 1121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Job *J) { 1141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return J->getKind() == JobListClass; 115789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar } 116789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar static bool classof(const JobList *) { return true; } 117789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar}; 1181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 119789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar} // end namespace driver 120789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar} // end namespace clang 121789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar 122789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar#endif 123