Job.h revision 2b81910618f63e4ce2373c926a26e76b4b91373f
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
17namespace clang {
18namespace driver {
19class Command;
20class Tool;
21
22class Job {
23public:
24  enum JobClass {
25    CommandClass,
26    JobListClass
27  };
28
29private:
30  JobClass Kind;
31
32protected:
33  Job(JobClass _Kind) : Kind(_Kind) {}
34public:
35  virtual ~Job();
36
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
43  static bool classof(const Job *) { return true; }
44};
45
46  /// Command - An executable path/name and argument vector to
47  /// execute.
48class 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
62public:
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.
67  const Action &getSource() const { return Source; }
68
69  /// getCreator - Return the Tool which caused the creation of this job.
70  const Tool &getCreator() const { return Creator; }
71
72  const char *getExecutable() const { return Executable; }
73
74  const ArgStringList &getArguments() const { return Arguments; }
75
76  static bool classof(const Job *J) {
77    return J->getKind() == CommandClass;
78  }
79  static bool classof(const Command *) { return true; }
80};
81
82  /// JobList - A sequence of jobs to perform.
83class JobList : public Job {
84public:
85  typedef 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
90private:
91  list_type Jobs;
92
93public:
94  JobList();
95  virtual ~JobList();
96
97  /// Add a job to the list (taking ownership).
98  void addJob(Job *J) { Jobs.push_back(J); }
99
100  /// Clear the job list.
101  void clear();
102
103  const list_type &getJobs() const { return Jobs; }
104
105  size_type size() const { return Jobs.size(); }
106  iterator begin() { return Jobs.begin(); }
107  const_iterator begin() const { return Jobs.begin(); }
108  iterator end() { return Jobs.end(); }
109  const_iterator end() const { return Jobs.end(); }
110
111  static bool classof(const Job *J) {
112    return J->getKind() == JobListClass;
113  }
114  static bool classof(const JobList *) { return true; }
115};
116
117} // end namespace driver
118} // end namespace clang
119
120#endif
121