153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar//===--- Action.h - Abstract compilation steps ------------------*- C++ -*-===//
253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar//
353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar//                     The LLVM Compiler Infrastructure
453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar//
553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar// This file is distributed under the University of Illinois Open Source
653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar// License. See LICENSE.TXT for details.
753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar//
853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar//===----------------------------------------------------------------------===//
953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
1053ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar#ifndef CLANG_DRIVER_ACTION_H_
1153ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar#define CLANG_DRIVER_ACTION_H_
1253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
132fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar#include "clang/Driver/Types.h"
142fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar#include "clang/Driver/Util.h"
15686775deca8b8685eb90801495880e3abdd844c2Chris Lattner#include "llvm/ADT/SmallVector.h"
16a1ead48a4e9961c7eb22592310c7e9c30cb56794Daniel Dunbar
17b1e25a1bc03292dc538d336573e0be1490223171Reid Klecknernamespace llvm {
18b1e25a1bc03292dc538d336573e0be1490223171Reid Klecknernamespace opt {
19b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner  class Arg;
20b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner}
21b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner}
22b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner
2353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbarnamespace clang {
2453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbarnamespace driver {
2553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Action - Represent an abstract compilation step to perform.
2753ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar///
2853ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar/// An action represents an edge in the compilation graph; typically
2953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar/// it is a job to transform an input using some tool.
302fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar///
312fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar/// The current driver is hard wired to expect actions which produce a
322fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar/// single primary output, at least in terms of controlling the
332fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar/// compilation. Actions can produce auxiliary files, but can only
342fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar/// produce a single output to feed into subsequent actions.
3553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbarclass Action {
3685da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbarpublic:
3785da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar  typedef ActionList::size_type size_type;
3885da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar  typedef ActionList::iterator iterator;
3985da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar  typedef ActionList::const_iterator const_iterator;
4085da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar
4185da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar  enum ActionClass {
4285da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar    InputClass = 0,
4385da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar    BindArchClass,
4485da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar    PreprocessJobClass,
4585da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar    PrecompileJobClass,
4685da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar    AnalyzeJobClass,
4730660a898545416f0fea2d717f16f75640001e38Ted Kremenek    MigrateJobClass,
4885da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar    CompileJobClass,
4985da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar    AssembleJobClass,
5085da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar    LinkJobClass,
5185da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar    LipoJobClass,
526e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar    DsymutilJobClass,
53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    VerifyDebugInfoJobClass,
54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    VerifyPCHJobClass,
5585da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar
5685da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar    JobClassFirst=PreprocessJobClass,
57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    JobClassLast=VerifyPCHJobClass
5885da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar  };
5985da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar
6085da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar  static const char *getClassName(ActionClass AC);
6185da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar
6285da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbarprivate:
6385da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar  ActionClass Kind;
6485da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar
652fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar  /// The output type of this action.
662fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar  types::ID Type;
671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
682fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar  ActionList Inputs;
692fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
7032c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel Dunbar  unsigned OwnsInputs : 1;
7132c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel Dunbar
722fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbarprotected:
7332c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel Dunbar  Action(ActionClass _Kind, types::ID _Type)
7432c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel Dunbar    : Kind(_Kind), Type(_Type), OwnsInputs(true)  {}
751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Action(ActionClass _Kind, Action *Input, types::ID _Type)
7632c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel Dunbar    : Kind(_Kind), Type(_Type), Inputs(&Input, &Input + 1), OwnsInputs(true) {}
771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Action(ActionClass _Kind, const ActionList &_Inputs, types::ID _Type)
7832c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel Dunbar    : Kind(_Kind), Type(_Type), Inputs(_Inputs), OwnsInputs(true) {}
7953ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbarpublic:
802fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar  virtual ~Action();
8185da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar
8231c11ebdaab0acfa10e231730ae95e32c0e39e1fDaniel Dunbar  const char *getClassName() const { return Action::getClassName(getKind()); }
8331c11ebdaab0acfa10e231730ae95e32c0e39e1fDaniel Dunbar
8432c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel Dunbar  bool getOwnsInputs() { return OwnsInputs; }
8532c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel Dunbar  void setOwnsInputs(bool Value) { OwnsInputs = Value; }
8632c1a2ae8b31f32e478c8e504ed81db8c8d25713Daniel Dunbar
8785da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar  ActionClass getKind() const { return Kind; }
8885da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar  types::ID getType() const { return Type; }
8985da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar
90a1ead48a4e9961c7eb22592310c7e9c30cb56794Daniel Dunbar  ActionList &getInputs() { return Inputs; }
91a1ead48a4e9961c7eb22592310c7e9c30cb56794Daniel Dunbar  const ActionList &getInputs() const { return Inputs; }
92a1ead48a4e9961c7eb22592310c7e9c30cb56794Daniel Dunbar
9385da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar  size_type size() const { return Inputs.size(); }
9485da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar
9585da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar  iterator begin() { return Inputs.begin(); }
9685da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar  iterator end() { return Inputs.end(); }
9785da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar  const_iterator begin() const { return Inputs.begin(); }
9885da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar  const_iterator end() const { return Inputs.end(); }
992fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar};
1002fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
1012fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbarclass InputAction : public Action {
10299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
103dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner  const llvm::opt::Arg &Input;
104dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner
1057ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbarpublic:
106dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner  InputAction(const llvm::opt::Arg &_Input, types::ID _Type);
10785da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar
108dd0b3c4c72464af92e2c27dd5a67e29f91ba7b28Reid Kleckner  const llvm::opt::Arg &getInputArg() const { return Input; }
10985da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar
1101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Action *A) {
1111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return A->getKind() == InputClass;
11285da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar  }
1132fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar};
1142fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
1152fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbarclass BindArchAction : public Action {
11699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
11710ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar  /// The architecture to bind, or 0 if the default architecture
11810ffa9a4887d9376e3eb3598e40523d1b58773c9Daniel Dunbar  /// should be bound.
1192fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar  const char *ArchName;
1202fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
1212fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbarpublic:
122f40ed17472a39097cc5039ed437445289487c9bfDaniel Dunbar  BindArchAction(Action *Input, const char *_ArchName);
12385da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar
12485da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar  const char *getArchName() const { return ArchName; }
12585da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar
1261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Action *A) {
1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return A->getKind() == BindArchClass;
12885da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar  }
1292fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar};
1302fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
1312fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbarclass JobAction : public Action {
13299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
1332fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbarprotected:
134f40ed17472a39097cc5039ed437445289487c9bfDaniel Dunbar  JobAction(ActionClass Kind, Action *Input, types::ID Type);
135f40ed17472a39097cc5039ed437445289487c9bfDaniel Dunbar  JobAction(ActionClass Kind, const ActionList &Inputs, types::ID Type);
13685da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar
13785da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbarpublic:
1381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Action *A) {
13985da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar    return (A->getKind() >= JobClassFirst &&
1401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            A->getKind() <= JobClassLast);
14185da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar  }
1427ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbar};
1437ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbar
1447ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbarclass PreprocessJobAction : public JobAction {
145651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void anchor() override;
1467ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbarpublic:
147f40ed17472a39097cc5039ed437445289487c9bfDaniel Dunbar  PreprocessJobAction(Action *Input, types::ID OutputType);
14885da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar
1491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Action *A) {
15085da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar    return A->getKind() == PreprocessJobClass;
1517ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbar  }
1527ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbar};
1537ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbar
1547ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbarclass PrecompileJobAction : public JobAction {
155651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void anchor() override;
1567ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbarpublic:
157f40ed17472a39097cc5039ed437445289487c9bfDaniel Dunbar  PrecompileJobAction(Action *Input, types::ID OutputType);
15885da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar
1591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Action *A) {
16085da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar    return A->getKind() == PrecompileJobClass;
1617ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbar  }
1627ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbar};
1637ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbar
1647ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbarclass AnalyzeJobAction : public JobAction {
165651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void anchor() override;
1667ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbarpublic:
167f40ed17472a39097cc5039ed437445289487c9bfDaniel Dunbar  AnalyzeJobAction(Action *Input, types::ID OutputType);
16885da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar
1691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Action *A) {
17085da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar    return A->getKind() == AnalyzeJobClass;
1717ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbar  }
1727ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbar};
1737ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbar
17430660a898545416f0fea2d717f16f75640001e38Ted Kremenekclass MigrateJobAction : public JobAction {
175651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void anchor() override;
17630660a898545416f0fea2d717f16f75640001e38Ted Kremenekpublic:
17730660a898545416f0fea2d717f16f75640001e38Ted Kremenek  MigrateJobAction(Action *Input, types::ID OutputType);
17830660a898545416f0fea2d717f16f75640001e38Ted Kremenek
17930660a898545416f0fea2d717f16f75640001e38Ted Kremenek  static bool classof(const Action *A) {
18030660a898545416f0fea2d717f16f75640001e38Ted Kremenek    return A->getKind() == MigrateJobClass;
18130660a898545416f0fea2d717f16f75640001e38Ted Kremenek  }
18230660a898545416f0fea2d717f16f75640001e38Ted Kremenek};
18330660a898545416f0fea2d717f16f75640001e38Ted Kremenek
1847ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbarclass CompileJobAction : public JobAction {
185651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void anchor() override;
1867ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbarpublic:
187f40ed17472a39097cc5039ed437445289487c9bfDaniel Dunbar  CompileJobAction(Action *Input, types::ID OutputType);
18885da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar
1891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Action *A) {
19085da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar    return A->getKind() == CompileJobClass;
19185da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar  }
1927ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbar};
1937ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbar
1947ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbarclass AssembleJobAction : public JobAction {
195651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void anchor() override;
1967ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbarpublic:
197f40ed17472a39097cc5039ed437445289487c9bfDaniel Dunbar  AssembleJobAction(Action *Input, types::ID OutputType);
19885da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar
1991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Action *A) {
20085da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar    return A->getKind() == AssembleJobClass;
2017ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbar  }
2027ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbar};
2037ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbar
2047ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbarclass LinkJobAction : public JobAction {
205651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void anchor() override;
2067ab25d5c03db34ca5cbca466a4caa224c4879ec6Daniel Dunbarpublic:
207f40ed17472a39097cc5039ed437445289487c9bfDaniel Dunbar  LinkJobAction(ActionList &Inputs, types::ID Type);
20885da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar
2091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Action *A) {
21085da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar    return A->getKind() == LinkJobClass;
21185da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar  }
2122fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar};
2132fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbar
2142fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbarclass LipoJobAction : public JobAction {
215651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void anchor() override;
2162fe63e6adac0b9e5f52bcc3100b545e379417e6eDaniel Dunbarpublic:
217f40ed17472a39097cc5039ed437445289487c9bfDaniel Dunbar  LipoJobAction(ActionList &Inputs, types::ID Type);
21885da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar
2191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  static bool classof(const Action *A) {
22085da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar    return A->getKind() == LipoJobClass;
22185da0071a4ab7d6f06831d20bad79122d7407df7Daniel Dunbar  }
22253ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar};
22353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
2246e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbarclass DsymutilJobAction : public JobAction {
225651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void anchor() override;
2266e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbarpublic:
2276e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  DsymutilJobAction(ActionList &Inputs, types::ID Type);
2286e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar
2296e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  static bool classof(const Action *A) {
2306e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar    return A->getKind() == DsymutilJobClass;
2316e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar  }
2326e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar};
2336e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar
234f857186fd1995b34185d063a29b11ad4f948519fEric Christopherclass VerifyJobAction : public JobAction {
235651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void anchor() override;
236651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic:
237651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  VerifyJobAction(ActionClass Kind, Action *Input, types::ID Type);
238651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  VerifyJobAction(ActionClass Kind, ActionList &Inputs, types::ID Type);
239651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static bool classof(const Action *A) {
240651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return A->getKind() == VerifyDebugInfoJobClass ||
241651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines           A->getKind() == VerifyPCHJobClass;
242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
243651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
244651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
245651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass VerifyDebugInfoJobAction : public VerifyJobAction {
246651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void anchor() override;
247651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic:
248651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  VerifyDebugInfoJobAction(Action *Input, types::ID Type);
249651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static bool classof(const Action *A) {
250651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return A->getKind() == VerifyDebugInfoJobClass;
251651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
252651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
253651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
254651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass VerifyPCHJobAction : public VerifyJobAction {
255651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void anchor() override;
256f857186fd1995b34185d063a29b11ad4f948519fEric Christopherpublic:
257651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  VerifyPCHJobAction(Action *Input, types::ID Type);
258f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  static bool classof(const Action *A) {
259651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return A->getKind() == VerifyPCHJobClass;
260f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  }
261f857186fd1995b34185d063a29b11ad4f948519fEric Christopher};
262f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
26353ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar} // end namespace driver
26453ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar} // end namespace clang
26553ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar
26653ec55215075c8f4ddd47ca6ed7d382f16beb670Daniel Dunbar#endif
267