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
1330a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/Basic/LLVM.h"
14789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar#include "llvm/ADT/SmallVector.h"
15b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/Option.h"
16651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include <memory>
17a1ead48a4e9961c7eb22592310c7e9c30cb56794Daniel Dunbar
18fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborgnamespace llvm {
19fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg  class raw_ostream;
20fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg}
21fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg
22789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarnamespace clang {
23789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarnamespace driver {
24b1e25a1bc03292dc538d336573e0be1490223171Reid Klecknerclass Action;
25daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbarclass Command;
26daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbarclass Tool;
27789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar
2864228b6c0696f3579d40bab0ef40691ef4f41242Hans Wennborg// Re-export this as clang::driver::ArgStringList.
295c6ecf5a07317edc4a01f967a43eb3f76142d387Hans Wennborgusing llvm::opt::ArgStringList;
304832ee31e6ab96b77ad429ef9347fbf09c099f47Hans Wennborg
31789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarclass Job {
32789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarpublic:
33789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar  enum JobClass {
34789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar    CommandClass,
35c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg    FallbackCommandClass,
36789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar    JobListClass
37789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar  };
38789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar
39789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarprivate:
40789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar  JobClass Kind;
41789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar
42789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarprotected:
43789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar  Job(JobClass _Kind) : Kind(_Kind) {}
44789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarpublic:
45789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar  virtual ~Job();
46789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar
47789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar  JobClass getKind() const { return Kind; }
48fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg
49fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg  /// Print - Print this Job in -### format.
50fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg  ///
51fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg  /// \param OS - The stream to print on.
52fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg  /// \param Terminator - A string to print at the end of the line.
53fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg  /// \param Quote - Should separate arguments be quoted.
54fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg  /// \param CrashReport - Whether to print for inclusion in a crash report.
55fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg  virtual void Print(llvm::raw_ostream &OS, const char *Terminator,
56fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg                     bool Quote, bool CrashReport = false) const = 0;
57789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar};
58789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar
59c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg/// Command - An executable path/name and argument vector to
60c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg/// execute.
61789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarclass Command : public Job {
62cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  /// Source - The action which caused the creation of this job.
63cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  const Action &Source;
64cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar
65daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  /// Tool - The tool which caused the creation of this job.
66daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  const Tool &Creator;
67daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar
68d57ac5990d22592665a67a28fc5d39f1155424d3Daniel Dunbar  /// The executable to run.
69789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar  const char *Executable;
70d57ac5990d22592665a67a28fc5d39f1155424d3Daniel Dunbar
71d57ac5990d22592665a67a28fc5d39f1155424d3Daniel Dunbar  /// The list of program arguments (not including the implicit first
72d57ac5990d22592665a67a28fc5d39f1155424d3Daniel Dunbar  /// argument, which will be the executable).
735c6ecf5a07317edc4a01f967a43eb3f76142d387Hans Wennborg  llvm::opt::ArgStringList Arguments;
74789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar
75789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarpublic:
76daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  Command(const Action &_Source, const Tool &_Creator, const char *_Executable,
775c6ecf5a07317edc4a01f967a43eb3f76142d387Hans Wennborg          const llvm::opt::ArgStringList &_Arguments);
78cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar
79651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void Print(llvm::raw_ostream &OS, const char *Terminator, bool Quote,
80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines             bool CrashReport = false) const override;
81fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg
82c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg  virtual int Execute(const StringRef **Redirects, std::string *ErrMsg,
83c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg                      bool *ExecutionFailed) const;
84aaaa2a1889fe882e7e41048e3b298ca594454eb1Hans Wennborg
85cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  /// getSource - Return the Action which caused the creation of this job.
86cae087e164e94e4286c11bf694dd0ff88f295302Daniel Dunbar  const Action &getSource() const { return Source; }
87789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar
88daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  /// getCreator - Return the Tool which caused the creation of this job.
89daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar  const Tool &getCreator() const { return Creator; }
90daab7b1016f0a82fefa4f7be6e63c57c06b19ffcDaniel Dunbar
91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const char *getExecutable() const { return Executable; }
92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
935c6ecf5a07317edc4a01f967a43eb3f76142d387Hans Wennborg  const llvm::opt::ArgStringList &getArguments() const { return Arguments; }
94789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar
951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Job *J) {
96c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg    return J->getKind() == CommandClass ||
97c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg           J->getKind() == FallbackCommandClass;
98789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar  }
99789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar};
100789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar
101c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg/// Like Command, but with a fallback which is executed in case
102c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg/// the primary command crashes.
103c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborgclass FallbackCommand : public Command {
104c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborgpublic:
105c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg  FallbackCommand(const Action &Source_, const Tool &Creator_,
106c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg                  const char *Executable_, const ArgStringList &Arguments_,
107c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg                  Command *Fallback_);
108c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg
109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void Print(llvm::raw_ostream &OS, const char *Terminator, bool Quote,
110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines             bool CrashReport = false) const override;
111c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg
112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int Execute(const StringRef **Redirects, std::string *ErrMsg,
113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines              bool *ExecutionFailed) const override;
114c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg
115c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg  static bool classof(const Job *J) {
116c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg    return J->getKind() == FallbackCommandClass;
117c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg  }
118c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg
119c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborgprivate:
120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::unique_ptr<Command> Fallback;
121c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg};
122c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg
123c8ba0a0acd30f0b56d08a3a0947f68ac01a40730Hans Wennborg/// JobList - A sequence of jobs to perform.
124789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarclass JobList : public Job {
125789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarpublic:
126686775deca8b8685eb90801495880e3abdd844c2Chris Lattner  typedef SmallVector<Job*, 4> list_type;
127cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar  typedef list_type::size_type size_type;
128cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar  typedef list_type::iterator iterator;
129cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar  typedef list_type::const_iterator const_iterator;
130789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar
131789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarprivate:
132789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar  list_type Jobs;
133789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar
134789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbarpublic:
135789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar  JobList();
1369d44023453094832ada2770941e9e4c96ce0e75eDaniel Dunbar  virtual ~JobList();
137789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar
138651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void Print(llvm::raw_ostream &OS, const char *Terminator,
139651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines             bool Quote, bool CrashReport = false) const override;
140fc3389701ead32709ba84825e4c06651065da2c0Hans Wennborg
1419d44023453094832ada2770941e9e4c96ce0e75eDaniel Dunbar  /// Add a job to the list (taking ownership).
142789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar  void addJob(Job *J) { Jobs.push_back(J); }
143789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar
1442b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  /// Clear the job list.
1452b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier  void clear();
1462b81910618f63e4ce2373c926a26e76b4b91373fChad Rosier
147789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar  const list_type &getJobs() const { return Jobs; }
148789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar
149cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar  size_type size() const { return Jobs.size(); }
150cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar  iterator begin() { return Jobs.begin(); }
151cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar  const_iterator begin() const { return Jobs.begin(); }
152cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar  iterator end() { return Jobs.end(); }
153cfcb96f610d6354234e8c33f3a25e340f6cd3a80Daniel Dunbar  const_iterator end() const { return Jobs.end(); }
1541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Job *J) {
1561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return J->getKind() == JobListClass;
157789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar  }
158789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar};
1591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
160789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar} // end namespace driver
161789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar} // end namespace clang
162789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar
163789e220d481371d52bd6265b5c414c5fe277f76bDaniel Dunbar#endif
164