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