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